多数据源配置与JTA事务问题
        项目中使用两个dataSourc,两个sessionFactory.由于业务变化,需要在项目中切换数据源,单独配置多数据源以及单独配置JTA都能成功,将多数据与JTA整合之后,项目启动总是抛出异常。
        异常如下:
  org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.
网上说是jdbc的事务与hibernate的事务起冲突了,但没有找到解决办法,求大神指点。
 1     <!-- atomikos事务管理器 -->
 2     <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
 3         init-method="init" destroy-method="close">
 4         <description>UserTransactionManager</description>
 5         <property name="forceShutdown"><value>true</value></property>
 6     </bean>
 7 
 8     <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
 9         <property name="transactionTimeout" value="300" />
10     </bean>
11 
12     <!-- spring 事务管理器 -->
13     <bean id="springTransactionManager"    class="org.springframework.transaction.jta.JtaTransactionManager">
14         <property name="transactionManager" ref="atomikosTransactionManager"/>
15         <property name="userTransaction" ref="atomikosUserTransaction"/>
16     </bean>
AOP配置:
 1 <aop:aspectj-autoproxy />
 2     <aop:config proxy-target-class="true">
 3         <aop:advisor pointcut="execution(* com.animoor.m2.application..*.*(..))" advice-ref="txAdvice" /> 
 4     </aop:config>
 5 
 6     <tx:advice id="txAdvice" transaction-manager="springTransactionManager">
 7         <tx:attributes>
 8             <tx:method name="get*" read-only="true" />
 9             <tx:method name="find*" read-only="true" />
10             <tx:method name="insert*" propagation="REQUIRED"/>
11             <tx:method name="update*" propagation="REQUIRED" />
12             <tx:method name="add*" propagation="REQUIRED" />
13             <tx:method name="delete*" propagation="REQUIRED" />
14             <tx:method name="update*" propagation="REQUIRED" />
15             
16             <tx:method name="save*" propagation="REQUIRED" />
17             <tx:method name="do*" propagation="REQUIRED" />
18                               ....
19         </tx:attributes>
20     </tx:advice>      
加入多数据源配置:
 1      <bean id="multipleDataSource" class="com.animoor.m2.sys.MultipleDataSource">
 2         <property name="defaultTargetDataSource" ref="dataSourceMes129"/>
 3         <property name="targetDataSources">
 4             <map key-type="java.lang.String">     
 5                 <!--注意这里的value是和上面的DataSource的id对应,key要和下面的CustomerContextHolder中的常量对应 -->
 6                 <entry key="dataSourceMes129" value-ref="dataSourceMes129" />
 7                 <entry key="dataSourceFgms129" value-ref="dataSourceFgms129"/>
 8                 <entry key="dataSourceMes168" value-ref="dataSourceMes168" />
 9                 <entry key="dataSourceFgms168" value-ref="dataSourceFgms168"/>
10             </map>   
11         </property>
12     </bean>
项目加载时调用的方法含get*,find*,将这些get去掉则不会抛出异常,但是去掉之后事务应该没有作用了吧。

请各位大神指点 谢谢  小弟没有金币悬赏,谢谢各位了。

2个回答

呵呵,搞spring配置确实麻烦,看来MultipleDataSource是animoor自己的库,刚在stackoverflow找到很久之前关于合并hibernate和jdbc
到一个事物的问答,http://stackoverflow.com/questions/4153199/hibernate-and-jdbc-in-one-transaction,
看看有没有启发。
兄弟是在搞横向扩展吗?

LittlehappyXz
瞬时间 谢谢哥们来看!嗯,MultipleDataSource类是自己配置的多数据源类,现在的需求是在原来两个数据源上再加上两个数据源,原来每个数据源对应一个sessionFactory,不存在事务冲突。
5 年多之前 回复

解决了吗,哥们!我觉得你截取的log不对吧!
但我觉得这样配置应该没问题。如果不用JtaTransactionManager,是有问题的,在service开启事务,一个事务肯定就一个datasource吧,所以在service切数据源肯定也不对,除非control层切

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐