java - 管理多个数据源的 session 时出现问题

标签 java hibernate spring jakarta-ee

我正在开发一个项目,其中每个服务都引用四个单独的数据源。到目前为止,我们一直在使用 ProxyFactoryBean 来引用 Dao 目标和事务拦截器 - 像这样......

<bean id="readOnlyUserProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
   <property name="target" ref="readOnlyDao"/>
   <property name="interceptorNames">
      <list>
         <value>readOnlyTransactionInterceptor</value>
      </list>
   </property>
</bean>

对于不同的 DAO,还有 3 个其他类似的代理。所有这些都涉及不同的事务拦截器,这些拦截器又连接到不同的事务管理器。简而言之,每个服务连接到 4 个 dao 代理,每个代理都引用一个单独的事务拦截器,每个拦截器又引用一个连接到 4 个不同数据源的单独事务管理器。到目前为止,使用lazy="false"一切工作正常。

现在,为了优化性能,我们希望启用“延迟加载”并将 hibernate session 传送到处理程序层。我们认为最好的方法是通过“TransactionProxyFactoryBean”,因为我们不想使用 OpenSessionInView 方法。

我们尝试了一些方法,但遇到了困难,因为我们通过每个服务连接到 4 个独立的数据源,现在我们可以将四个独立的事务管理器连接到“TransactionProxyFactoryBean”。因此,我们无法找到一种方法来管理处理程序/服务层中不同数据源的事务。

我刚刚开始从事这项工作,对Spring事务管理没有太多经验。请指导我采取任何可能的方法。

最佳答案

跨多个数据源管理事务是应用程序服务器的工作。应用程序服务器将通过 JTA API 公开这些事务,Spring 可以使用 JtaTransactionManager 从 JPA API 桥接到 Spring API。

至于如何配置应用程序服务器本身,这取决于它是什么应用程序服务器,您应该对该文档进行一些研究。这可能是一个相当复杂的操作,特别是如果数据源分布在不同的数据库服务器上(在这种情况下,您需要 XA 事务监视器,并且一切都会变得非常复杂)。

关于java - 管理多个数据源的 session 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1518427/

相关文章:

java - 无法在 Spring Controller 中接收对象

java - postgres 中的大量 SHOW TRANSACTION ISOLATION LEVEL 查询

java - spring mvc 与 hibernate 一起使用更好吗?

java - CascadeType.ALL 不更新子元素

unit-testing - 如何以编程方式创建 Spring 上下文?

java - 如何使用 Servlet 3.0 注释配置(或 Spring)设置 JSP 页面编码?

java - 如何访问另一个 firebase 项目的数据

java - 没有自然键可用时 equals() 和 hashCode() 的实现?

java - 如何在不使用存储阵列的情况下将 2D 阵列旋转 90 度?

java - java中的异常