1

我要解决的问题背景:我有一个 java spring http 拦截器 AuditHttpCommunicationInterceptor ,它审计与外部系统的通信。进行通信的 HttpClieant 用于执行某些称为 DoBusinessLogicService 的业务逻辑的 java 服务类。DoBusinessLogicServices 打开一个新事务并使用几个协作者来做很多事情。

要解决的问题:无论 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 使用新的数据库连接。因此,对于每个 DoBusinessLogicService 调用,我需要 2 个数据库连接。基本上,我想知道问题的解决方案:如何让 TransactionTemplate “暂停”当前事务并在这种情况下将连接重用于新的事务。

有任何想法吗?:)

PS 一个想法可能是采用不同的设计方法:删除拦截器并创建一个直接在 DoBusinessLogicSevice 中使用的 AuditingHttpClient(不是由 spring 调用的),但我不能这样做,因为我无法访问那里的所有 http 字段。

4

1 回答 1

2

Spring 支持嵌套事务(propagation="NESTED"),但这确实取决于数据库平台,我不相信每个数据库平台都能够处理嵌套事务。

我真的不明白从池中获取连接、进行快速审计事务并返回连接有什么大不了的。

更新:虽然 Spring 支持嵌套事务,但 Hibernate 似乎不支持。如果是这种情况,我会说:使用另一个连接进行审计。

于 2012-06-07T13:32:59.477 回答