我正在开发一个使用Java,Spring和Hibernate的项目。 我刚刚遇到过像这样的情况。
bean 1:
<bean id="cat" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>cat</value>
</list>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="attributeSource"/>
</property>
</bean>
bean 2:
<bean id="dog" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>dog</value>
</list>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="attributeSource"/>
</property>
</bean>
但在执行获取以下异常时
org.springframework.jdbc.support.SQLErrorCodesFactory] Error while extracting database product name - falling back to empty error codes
org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data;
nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection;
nested exception is java.sql.SQLException: Connection has already been created in this tx context for pool Illegal attempt to create connection from another pool
Caused by:
at weblogic.jdbc.jts.Driver.getExistingConnection(Driver.java:613)
假设猫和狗是两个不同的界面
我们不能打开两个事务管理器吗?答案 0 :(得分:-2)
虽然这与weblogic有关,但答案可能与您的问题相符:http://objectmix.com/weblogic/549975-connection-has-already-been-created-tx-context-pool-named.html
答案基本上是:不,你不能
问题是您不能在一个中使用两个连接池 交易。 =解决方案是在bean中使用单独的方法 用于调用profilePool,并将此方法设置为 TRANSACTION-NOTSUPPORTED,以便对配置文件池执行只读工作 发生在交易之外o = n vcheqPool(我认为是 错误消息是说profilePool是只读的 - 如果没有 将'profilePool和vcheqPool交换在它们之前出现的地方)
为了在一个数据库中使用来自两个或多个数据库的连接 交易,您必须执行以下操作:
- 两个驱动程序必须符合XA
- 您必须使用TXDataSources
- 您需要通过容器(SessionBean with“Requires”)或UserTransaction
进行全局事务当您满足所有这些要求时,您将能够使用 在一个事务中来自多个DataSource的连接。