public void completeOrder(OrderRequest request) {
generateOrder(request); // DB call
generateInvoice(request); // DB call
paymentApi(request); // external API call
savePaymentInfo(request); // DB call
createSubscription(request) // DB call
sendInvoiceEmail() // internal API call
}
在上面的代码片段中:
- Connection被打开并开始生成订单,直到completeOrder方法的所有代码段都被执行。
1.如果在支付API中存在任何延迟,则连接处于挂起状态,并且不返回到连接池。
1.如果我们有并发用户处理完整的订单,应用程序将耗尽数据库连接,从而导致应用程序延迟。
我浏览了一个博客,它试图在TransactionTemplate(https://medium.com/javarevisited/transaction-management-in-spring-boot-eb01e20b21fe)的帮助下解决这个问题,但对我不起作用。
如果我看到下面代码的日志,我会得到 HikariPool-1 - Pool stats(total=10,active=1,idle=9,waiting=0),即使执行了saveTestDto(testDto)。是否有什么我需要做额外的或者我们有一些其他的技术来解决这样的问题。
@Service("testService")
public class TestServiceImpl implements TestService{
@Autowired
TestRepository testRepository;
@Autowired
private TransactionTemplate template;
@Override
public void testMethod(TestDto testDto) throws InterruptedException {
template.execute(
status -> {
saveTestDto(testDto);
return testDto;
}
);
this.sleep();
template.execute(
status -> {
updateTestDto(testDto);
log.info("Object updated.");
return testDto;
}
);
}
private void saveTestDto(TestDto testDto){
testRepository.saveAndFlush(testDto);
log.info("Object saved.");
}
private void updateTestDto(TestDto testDto){
testDto.setInfo("This is test 1");
testRepository.saveAndFlush(testDto);
log.info("Object saved.");
}
private void sleep() throws InterruptedException {
Thread.sleep(60000);
}
}
1条答案
按热度按时间zbdgwd5y1#
我建议您确保没有将对事务管理器的调用打包到另一个事务中。如果您使用spring Boot ,那么由于OSIV,每个rest请求都有可能被打包到事务中
您可以在此处了解有关Spring Open Session in View的更多信息