项目中使用两个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去掉则不会抛出异常,但是去掉之后事务应该没有作用了吧。
请各位大神指点 谢谢 小弟没有金币悬赏,谢谢各位了。