transactionManager 应该使用哪个 SessionFactory?
Posted
技术标签:
【中文标题】transactionManager 应该使用哪个 SessionFactory?【英文标题】:which SessionFactory should be use for transactionManager? 【发布时间】:2009-12-26 02:56:52 【问题描述】: <bean id="projectService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target">
<bean class="com.company.project.company.services.ServiceImpl" init-method="init">
<property name="HRappsdao" ref="HRappsdao"/>
<property name="projectdao" ref="projectdao"/>
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="store*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="bulkUpdate*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
</bean>
我有 2 个数据源 HRappsdao 和 projectdao,它们都使用不同的 sessionFactory。在这种情况下,我的 transactionmanager 应该使用哪个 sessionfactory?(hrappsdao 或 projectdao)?
已编辑
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" > //my HRappsdao using same
<ref local="sessionFactory"/>
</property>
</bean>
【问题讨论】:
【参考方案1】:实际上,您没有显示事务管理器的配置,所以我不确定您当前使用的是什么,但引用文档:
JTA(通常通过
JtaTransactionManager
)是访问同一事务中的多个事务资源所必需的。
在 Spring 2.5 中,考虑使用“new”<tx:jta-transaction-manager/>
配置元素来自动检测基于 JTA 的底层事务平台(适用于大多数应用服务器)。有关此内容的更多详细信息,请参阅章节9.8. Application server-specific integration。
如果您使用的是旧版本的 Spring,则需要手动配置您的 JtaTransactionManager
。这将需要您的应用程序服务器的一些知识,因为 JTA TransactionManager 的 JNDI 位置特定于每个 J2EE 服务器。
如果您需要更多指导,请提供更多详细信息(如 Spring 的版本和您使用的应用服务器)。
更新:正如我所说,当使用多个数据源时,您需要使用 JtaTransactionManager
而不是 HibernateTransactionManager
(请参阅 javadoc)。如果您使用的是 Spring 2.5,请按如下方式更新您的 Spring 配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<tx:jta-transaction-manager />
<!--
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
//my HRappsdao using same
<ref local="sessionFactory" />
</property>
</bean>
-->
...
</beans>
请注意,您需要像 JOTM 这样的 Tomcat 或 Jetty。您或许应该考虑迁移到 JBoss 或 Glassfish 等 J2EE 应用服务器。
【讨论】:
以上是我的事务管理器如何使用 sessionFActory。但由于 2 个不同的数据源,我有 2 个 sessionfactory。所以我想知道在这种情况下,如何使用事务性 我的应用服务器也只是tomcat/jetty。不使用 j2ee 容器以上是关于transactionManager 应该使用哪个 SessionFactory?的主要内容,如果未能解决你的问题,请参考以下文章
Jboss 7 - Spring - 使用 Jboss TransactionManager
使用 TransactionManager(JMS、数据库)启动多个事务
没有为限定符“transactionManager”找到匹配的 PlatformTransactionManager bean
Hibernate:无法访问 TransactionManager 或 UserTransaction 以进行物理事务委托