Частичный откат транзакции, вызванный неверно настроенным источником данных XA - PullRequest
0 голосов
/ 26 марта 2020

В последнее время мы столкнулись с некоторыми проблемами согласованности. После отката транзакции откатывается только часть транзакции, оставляя базу данных в несогласованном состоянии. Кроме того, наши журналы содержат ошибки ActiveMQ, такие как

AMQ214004: XA end operation failed : org.apache.activemq.artemis.api.core.ActiveMQInterruptedException: java.lang.InterruptedException

Устранение неполадок: я обнаружил, что наши источники данных не являются источниками данных xa, настроенными для jta="false":

<datasources>
    <datasource jta="false" jndi-name="java:/sample.ds" pool-name="sample" enabled="true" use-ccm="false">
        <connection-url>jdbc:mysql:/host/dbName?autoReconnect=true</connection-url>
        <driver>mysql</driver>
        <pool>...</pool>
        <security>...</security>
        <validation>...</validation>
        <timeout>...</timeout>
        <statement>
            <share-prepared-statements>false</share-prepared-statements>
        </statement>
    </datasource>
    <datasource jta="false" jndi-name="java:/readonly.ds" pool-name="ro" enabled="true" use-ccm="false">
        <connection-url>jdbc:mysql://host2/db2Name?autoReconnect=true</connection-url>
        <driver>mysql</driver>
        <security>...</security>
        <validation>...</validation>
        <statement>
            <share-prepared-statements>false</share-prepared-statements>
        </statement>
    </datasource>
    <drivers>
        <driver name="mysql" module="com.mysql.jdbc">
            <xa-datasource-class>com.mysql.cj.jdbc.MysqlXADataSource</xa-datasource-class>
        </driver>
    </drivers>
</datasources>

Персистентные единицы конфигурируются с:

<persistence-unit name="sample">
    <jta-data-source>java:/a.ds</jta-data-source>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
        <property name="hibernate.cache.use_second_level_cache" value="true"/>
    </properties>
</persistence-unit>
<persistence-unit name="readonly">
    <jta-data-source>java:/readonly.ds</jta-data-source>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.connection.readOnly" value="true"/>
    </properties>
</persistence-unit>

Как правильно настроить вышеуказанные источники данных? Достаточно ли просто использовать источник данных xa-данных с jta = true для источника данных sample или есть другие неправильные конфигурации, о которых я еще не знаю?

Мы используем JMS для обмена сообщениями, mysql мастер базы данных для чтения / записи и реплики для не важных, но дорогостоящих запросов.

...