项目中使用两个dataSourc,两个sessionFactory.由于业务变化,需要在项目中切换数据源,单独配置多数据源以及单独配置JTA都能成功,将多数据与JTA整合之后,项目启动总是抛出异常。
异常如下:
1 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的事务起冲突了,但没有找到解决办法,求大神指点。
JTA配置如下:
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去掉则不会抛出异常,但是去掉之后事务应该没有作用了吧。
请各位大神指点指点,小弟先谢过了。
都没有人来看看 大神们!
建议去iteye问问~