使用Spring post commit注意点

19-02-17 banq
              

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);

    }

}

测试源代码可以在这里找到