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);
}
}
测试源代码可以在这里找到