#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.