Проблема с соединением SQL - PullRequest
1 голос
/ 16 сентября 2010

Я работаю над проектом, который использует 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)

Предположим, что cat и dog - это два разных интерфейса

Не можем ли мы открыть два менеджера транзакций?

1 Ответ

0 голосов
/ 16 сентября 2010

Хотя речь идет о 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 с «Требуется») или через UserTransaction

Когда вы выполните все эти требования, вы сможете использовать соединения из более чем одного источника данных в одной транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...