Activemq broker зависает с HikariCP и автокоммитированием, установленным в false

#activemq #hikaricp #autocommit

#activemq #hikaricp #автоматическая фиксация

Вопрос:

У меня есть встроенный ActiveMQ в моем приложении, которому нужен DS. Я использовал Tomcat CP (в течение нескольких лет) и пытаюсь переключиться на Hikari. Флаг startAsynch для брокера MQ имеет значение false.

При настройке Hikari, если я устанавливаю значение автоматической фиксации false, ActiveMQ broker зависает во время запуска.

Однако, если я установлю для autocommit значение True, то проблем не возникнет, и брокер будет работать просто отлично.

С другой стороны, если я запускаю ActiveMQ с флагом startAsynch равным true, у брокера не возникает проблем, даже если для автоматической фиксации в Hikari установлено значение false.

Вот интересный момент — он появляется в tomcat CP, автокоммит использует все, что использует базовый драйвер — в моем случае это драйвер oracle, и, похоже, по умолчанию для драйвера oracle autoCommit установлено значение true.

Версия ActiveMQ — 5.16.0, а Hikari — 3.4.5

Конфигурация HikariCP:

 <bean id="dataSourceForBroker" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <property name="driverClassName" value="${driverClassName}"/>
    <property name="jdbcUrl" value="${url}"/>
    <property name="username" value="${dbusername}"/>
    <property name="password" value="${password}"/>
    <property name="maximumPoolSize" value="${dbSessionMaxActive}" />
    <property name="autoCommit" value="false"/>
    <property name="minimumIdle" value="10" />
    <property name="maxLifetime" value="30000" />
    <property name="connectionTimeout" value="60000" />
</bean>
  

Фрагмент, который создает брокера, является

 public void ccreateBroker(){
    BrokerService broker = new BrokerService();
    broker.setBrokerId("myBroker");
    broker.setBrokerName("myBroker");
    broker.setPersistent(true);
    broker.setUseJmx(true);
    broker.setUseShutdownHook(true);
    broker.setStartAsync(false);
    broker.requestRestart();
    broker.getManagementContext().setConnectorPort(9999);
    broker.addShutdownHook(() -> {
        brokerStarted = false;
        logger.info("Active MQ broker was shutdown");
    });

    ManagementContext managementContext = new ManagementContext();
    managementContext.setCreateConnector(false);
    broker.setManagementContext(managementContext);

    JDBCPersistenceAdapter jdbcPersistenceAdapter = new JDBCPersistenceAdapter();
    jdbcPersistenceAdapter.setDataSource(dataSource);
    LeaseDatabaseLocker leaseDatabaseLocker = new LeaseDatabaseLocker();
    try {
        broker.setPersistenceAdapter(jdbcPersistenceAdapter);
        jdbcPersistenceAdapter.setLockKeepAlivePeriod(5000);
        leaseDatabaseLocker.setLockAcquireSleepInterval(10000);
        jdbcPersistenceAdapter.setLocker(leaseDatabaseLocker);
        broker.addConnector("vm://hexgenBroker");
        broker.start();
        brokerStarted = true;
    } catch (Exception e) {
        throw new RuntimeException("Broker failed -", e);
    }
}
  

Есть какие-либо указания на то, почему это происходит? Я здесь немного потерялся

заранее спасибо -anish

Комментарии:

1. Почему вы пытаетесь переключиться на Hikari?

2. Хороший вопрос — к сожалению, у меня нет хорошего ответа, кроме того, что я экспериментирую, чтобы увидеть, работает ли он лучше

3. Я был бы удивлен, если бы реализация пула соединений была узким местом производительности для ActiveMQ 5.x. Однако у него, безусловно, есть свои ограничения. ActiveMQ Artemis был разработан для устранения этих ограничений. Если вам нужна более производительная версия ActiveMQ, я рекомендую вам попробовать ее.

4. Спасибо за указатель — заглянем в Artemis. Однако на данный момент игнорируйте производительность — я пытаюсь понять причину, по которой эта конфигурация не работает

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