简介

为了在ActiveMQ V4.x中实现持久消息传递的高性能,我们强烈建议您使用我们的高性能日志 - 默认情况下已启用。这很像一个数据库消息(以及transcation提交/回滚和消息确认)以尽可能快的速度写入日志 - 然后每隔一段时间我们将日志检查到长期持久性存储(在本例中为JDBC)。

它在使用队列时很常见,例如消息在发布后很快消耗掉; 因此,您可以发布10,000条消息,并且只有一些未完成的消息 - 因此,当我们检查JDBC数据库时,我们通常只有少量消息可以实际写入JDBC。即使我们必须将所有消息写入JDBC,我们仍然可以通过日志获得性能提升,因为我们可以使用大型事务批处理将消息插入JDBC数据库以提高JDBC端的性能。

JDBC With Journal方式克服了JDBC Store的不足,使用快速的缓存写入技术,大大提高了性能。

JDBC With Journal方式,发送出来的消息会在内存中告诉缓存,接收端若在没有接收情况下7~10分钟后再写入数据库,这样接收端就不用等到数据库操作完了之后再接收消息。

JDBC Store和JDBC Message Store with ActiveMQ Journal的区别


  1. Jdbc with journal的性能优于jdbc
  2. Jdbc用于master/slave模式的数据库分享
  3. Jdbc with journal不能用于master/slave模式
  4. 一般情况下,推荐使用jdbc with journal

使用(示例)

1、打开activemq.xml配置文件(在apache-activemq/conf文件夹下),​将原来使用的kahaDB消息持久化机制注释掉​,添加以下代码:

<persistenceFactory>
<journalPersistenceAdapterFactory
journalLogFiles="4"
journalLogFileSize="32768"
useJournal="true"
useQuickJournal="true"
dataSource="#mysql-ds"
dataDirectory="activemq-data"/>
</persistenceFactory>

ActiveMQ消息持久化机制之JDBC With Journal_xml配置

2、数据库连接池配置(使用官方自带的连接池),将其配置到activemq.xml配置文件中的</broker>标签之后,<import>标签之前,官方连接池配置示例: 

<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="poolPreparedStatements" value="true"/>
</bean>

ActiveMQ消息持久化机制之JDBC With Journal_xml配置_02