ActiveMQ Artemis JDBC Store: добавить пул соединений для соединений с БД?

Я использую последнюю версию ActiveMQ Artemis с базой данных MySQL в качестве хранилища сообщений. Через 8 часов у моего сервера истекает время ожидания клиентских подключений к базе данных. AbstractJDBCDriver в Artemis не распознает это и выдает исключение.

Что делать? Я не вижу возможности для пула подключений к БД с этой реализацией.

at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) [mysql-connector-java.jar:8.0.19]
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) [mysql-connector-java.jar:8.0.19]
    at com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2056) [mysql-connector-java.jar:8.0.19]
    at org.apache.activemq.artemis.jdbc.store.drivers.AbstractJDBCDriver.stop(AbstractJDBCDriver.java:108) [artemis-jdbc-store-2.10.0.redhat-00004.jar:2.10.0.redhat-00004]

Тот же вопрос здесь.


person Ginkgochris    schedule 27.03.2020    source источник


Ответы (2)


На этом этапе лучше всего перезапустить брокера, когда это произойдет. Как вы заметили, в настоящее время нет реализации пула соединений с БД.

person Justin Bertram    schedule 27.03.2020
comment
Хммм :( Последняя попытка заключалась в анализе кода. В общем, код готов принять объединенный DataSurce (например, c3p0). Но setDataSource (DataSource dataSource) в этом классе github.com/ apache / activemq-artemis / blob / master / artemis-server / используется только в тестах и ​​не может быть установлен в конфигурации broker-xml. - person Ginkgochris; 03.04.2020
comment
Таким образом, анализатор конфигурации всегда напрямую использует драйвер jdbc. github.com/apache/activemq-artemis/blob/ (createDatabaseStoreConfig) - person Ginkgochris; 03.04.2020
comment
Код, безусловно, можно изменить для использования пула, но этот пул поможет только в том случае, если он реализует какой-то механизм проверки соединения перед его передачей. - person Justin Bertram; 03.04.2020
comment
Точно! Это то, что docs.oracle. com / javase / 7 / docs / api / java / sql / используется для. Мое текущее решение: отправлять сообщения ping брокеру, чтобы поддерживать соединения с базой данных (hmpf ..) - person Ginkgochris; 06.04.2020
comment
Бесполезный. Я пытался часто опрашивать базу данных через amq7-broker / bin / artemis address show, но все еще есть тайм-аут для других подключений к базе данных. Использование хранилища сообщений с Artemis определенно экспериментально. Не используйте его в производстве. - person Ginkgochris; 09.04.2020
comment
Это четко указано в документации, в которой говорится , ПРЕДУПРЕЖДЕНИЕ. Хранилище сохраняемости JDBC Apache ActiveMQ Artemis находится в стадии разработки и включено для ознакомительных целей. - person Justin Bertram; 09.04.2020

В последней версии Artemis (2.16.0) есть поддержка пула соединений.

Базовый пример с MySQL:

  1. Создайте новый экземпляр брокера:
$ARTEMIS_HOME/bin/artemis create hosts/host0 --name host0 --user admin --password admin --require-login
  1. Запустите базу данных и создайте выделенный экземпляр:
CREATE DATABASE activemq CHARACTER SET utf8mb4;
CREATE USER 'activemq'@'%' IDENTIFIED WITH mysql_native_password BY 'activemq';
GRANT CREATE,SELECT,INSERT,UPDATE,DELETE,INDEX ON activemq.* TO 'activemq'@'%';
FLUSH PRIVILEGES;
  1. Загрузите и скопируйте конкретный драйвер JDBC:
curl -sL https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.22.tar.gz -o driver.tar.gz
tar xf driver.tar.gz && cp mysql-connector-java-8.0.22/mysql-connector-java-8.0.22.jar hosts/host0/lib/
  1. Добавьте хранилище JDBC с конфигурацией пула соединений:
<store>
    <database-store>
        <data-source-properties>
            <!-- All configuration options: https://commons.apache.org/proper/commons-dbcp/configuration.html -->
            <data-source-property key="driverClassName" value="com.mysql.cj.jdbc.Driver" />
            <data-source-property key="url" value="jdbc:mysql://localhost:3306/activemq" />
            <data-source-property key="username" value="activemq" />
            <data-source-property key="password" value="activemq" />
            <data-source-property key="poolPreparedStatements" value="true" />
            <!-- Avoid MySQL default behavior of killing long lived connections after 1 hour -->
            <data-source-property key="maxConnLifetimeMillis" value="1800000" />
        </data-source-properties>
        <bindings-table-name>BINDINGS</bindings-table-name>
        <message-table-name>MESSAGES</message-table-name>
        <large-message-table-name>LARGE_MESSAGES</large-message-table-name>
        <page-store-table-name>PAGE_STORE</page-store-table-name>
        <node-manager-store-table-name>NODE_MANAGER_STORE</node-manager-store-table-name>
    </database-store>
</store>
person fvaleri    schedule 21.12.2020