【发布时间】:2014-07-08 13:10:42
【问题描述】:
我想知道是否可以在一种服务方法中使用两个事务管理器。 因为由于客户端 mysql db 配置的限制,我们在一个数据库中有 2 个不同的数据源,即每个 schema 一个 user/pwd/url。这就是为什么我必须配置两个事务管理器。现在,当涉及到服务实现时,我遇到了问题。见以下代码:
public class DemoService{
...
@Transactional(value = "t1")
public doOne(){
doTwo();
}
@Transactional(value = "t2")
public doTwo(){
}
...
}
如果我使用此 Code Pattern,我总是会遇到异常
org.hibernate.HibernateException: No Session found for current thread
如果我分别运行这两种方法,效果很好。 我错过了什么?或者这里还有其他工作? 任何建议将不胜感激。
顺便说一句:我的一些配置
<bean id="sessionFactorySso" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="mappingLocations">
<list>
<value>classpath*:sso.vo/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="generateDdl">true</prop>
<prop key="hibernate.dialect">${dialect} </prop>
</props>
</property>
<property name="dataSource" ref="dataSourceSso"/>
</bean>
<bean id="dataSourceSso" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driver}"/>
<property name="jdbcUrl" value="${sso.url}"/>
<property name="user" value="${sso.username}"/>
<property name="password" value="${sso.password}"/>
<!-- these are C3P0 properties -->
<property name="acquireIncrement" value="2" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="2" />
<property name="automaticTestTable" value="test_c3p0" />
<property name="idleConnectionTestPeriod" value="300" />
<property name="testConnectionOnCheckin" value="true" />
<property name="testConnectionOnCheckout" value="true" />
<property name="autoCommitOnClose" value="true" />
<property name="checkoutTimeout" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="maxIdleTime" value="0" />
</bean>
<bean id="transactionManagerSso" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactorySso"/>
<qualifier value="sso" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerSso" />
【问题讨论】:
-
doTwo上的@Transactional在从doOne调用时被忽略。由于 Spring 为 aop 使用代理,因此只拦截外部方法调用。 -
@M. Deinum 所以你的意思是没有更好的解决方案?
-
您必须将 bean 注入自身并在其上调用方法(就像使用 EJB 一样)。
-
谢谢,我可以试试。
标签: java spring hibernate jakarta-ee