You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by emcee21 <mi...@gmail.com> on 2007/10/26 07:20:34 UTC

Hot tip for gigantic queues + MySQL

Running 4.1.1, journaled-jdbc on MySQL 5.0, I have a 10GB ACTIVEMQ_MSGS table
with ~100k messages.  I found the default "deleteOldMessagesStatement" was
performing very poorly.  This is due to a known issue on MySQL with
correlated subqueries.  

To address the problem, I created the following stored procedure:

CREATE PROCEDURE deleteOldMessages (minExpiration LONG)
BEGIN

CREATE TEMPORARY TABLE MinAcks SELECT CONTAINER, MIN(LAST_ACKED_ID) id from
ACTIVEMQ_ACKS GROUP BY CONTAINER;

delete m from ACTIVEMQ_MSGS m LEFT OUTER JOIN MinAcks a ON m.CONTAINER =
a.container WHERE (a.id is not null and m.ID <= a.id) or (expiration <> 0
and expiration < minExpiration);

DROP TEMPORARY TABLE MinAcks;

END


and added the following to my broker-config.xml:

		<persistenceAdapter>
			<journaledJDBC journalLogFiles="5"
				dataDirectory="activemq-data" dataSource="#queueDataSource"
				useDatabaseLock="false">
				<statements>
					<statements deleteOldMessagesStatement="call deleteOldMessages(?)"/>
				</statements>
			</journaledJDBC>
		</persistenceAdapter>


Believe it or not, this provided a drastic improvement in performance for my
application.
-- 
View this message in context: http://www.nabble.com/Hot-tip-for-gigantic-queues-%2B-MySQL-tf4695270s2354.html#a13421060
Sent from the ActiveMQ - User mailing list archive at Nabble.com.