Details
Description
Two active MQ brokers are installed on RH EL 5 servers (one per server).
They're configured as a JDBC master / slave failover (as per examples). Failover is tested and working and messages delivered.
Oracle is used for synchronisation (ACTIVEMQ_ tables), persistence etc.
We run a durable subscriber, and the client connects via a failover operation.
The SELECT * FROM ACTIVEMQ_LOCK FOR UPDATE is causing spin lock on the Oracle database.
Basically the indefinite waiting from the passive mq instance is causing high resource usage on Oracle.
After a short period Oracle dashboard shows a high number of active sessions from Active MQ due to the continuous execution of
UPDATE ACTIVEMQ_LOCK SET TIME = ? WHERE ID = 1
in the keepAlive method in
https://svn.apache.org/repos/asf/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/store/jdbc/DatabaseLocker.java
As a workaround we've had to push out the lockAcquireSleepInterval to 5 minutes in the configuration of ActiveMQ, but this didn't work.
<jdbcPersistenceAdapter dataSource="#oracle-ds" useDatabaseLock="true" lockAcquireSleepInterval="300000" createTablesOnStartup="true"/>
We're currently changing the broker to poll rather than block so in Statement.java we've added a WAIT 0 that throws an exception if the lock is not acquired.
public String getLockCreateStatement() {
if (lockCreateStatement == null) {
lockCreateStatement = "SELECT * FROM " + getFullLockTableName();
if (useLockCreateWhereClause)
lockCreateStatement += " FOR UPDATE WAIT 0";
}
return lockCreateStatement;
}
Any suggestions to this issue, this seems to be a quite fundamental issue?