我想解决的问题的上下文:我有一个java spring http拦截器AuditHttpCommunicationInterceptor,用于审核与外部系统的通信。执行通信的HttpClieant在java服务类中使用,该服务类执行一些名为DoBusinessLogicSevice的业务逻辑。 DoBusinessLogicSevice打开一个新的事务,并使用几个协作者完成大量的事情。
要解决的问题:无论DoBusinessLogicSevice中的任何操作的结果如何(意外的异常等),我都希望审计由AuditHttpCommunicationInterceptor存储在数据库中。
我使用的解决方案:AuditHttpCommunicationInterceptor将以这种方式打开一个新事务:
TransactionDefinition transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
new TransactionTemplate(platformTransactionManager, transactionDefinition).execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// do stuff
}
});
一切正常。当DoBusinessLogicSevice的一部分抛出意外异常时,其事务将被回滚,但AuditHttpCommunicationInterceptor会将审计存储在数据库中。
此解决方案产生的问题:AuditHttpCommunicationInterceptor使用新的数据库连接。因此,对于每个DoBusinessLogicSevice调用,我需要2个db连接。 基本上,我想知道问题的解决方案:如何使TransactionTemplate“挂起”当前事务,并在这种情况下重新使用新连接。
有什么想法吗? :)
P.S。 一个想法可能是采用不同的设计方法:删除拦截器并创建一个直接在DoBusinessLogicSevice中使用的AuditingHttpClient(不是由spring调用)但我不能这样做,因为我无法访问那里的所有http字段。
答案 0 :(得分:1)
Spring支持嵌套事务(propagation =“NESTED”),但这实际上取决于数据库平台,我不相信每个数据库平台都能够处理嵌套事务。
我真的没有看到从池中获取连接,执行快速审计事务以及返回连接有什么大不了的。
更新:虽然Spring支持嵌套事务,但看起来Hibernate却没有。如果是这种情况,我会说:选择其他连接进行审核。