使用Spring post commit注意点


Spring post-commit钩子会一直保持数据库连接打开直到完成,因此使用afterCommit方法实现提交后的钩子时,其中任务不能耗时过长,因为这是数据库连接一直打开,没有关闭归还到连接池,在负载很重的情况下,会导致连接池资源耗尽。因此,避免在提交后执行耗时的任务,如下:
@Service
public class UserService {

    private static final Logger logger 
            = Logger.getLogger(UserService.class.getName());   
    
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void updateUser() {

        TransactionSynchronizationManager.registerSynchronization(
                new TransactionSynchronizationAdapter() {
            @Override
            public void afterCommit() {
                logger.info(() -> "Right after commit ...");
               // 记住数据库连接没有归回到池,直至这段代码完成
               //在这里避免执行耗费时间的任务        
            }
        });

        User user = userRepository.findById(1L).get();

        user.setAge(26);
    }
}
测试源代码可以在这里找到