日期:2014-05-16  浏览次数:20441 次

5.4JDBC消息仓库(二)
5.4.3配置JDBC消息仓库
默认JDBC消息仓库配置是简单的。如前面陈述的,默认的JDBC仓库在代理配置中使用Apache Derby,如下:<beans>
<broker brokerName="test-broker"
persistent="true"
xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="activemq-data"/>
</persistenceAdapter>
</broker>
</beans>
这个之前的配置为ActiveMQ代理以JDBC消息仓库(默认使用Apach Derby)配置持久化适配器并且设置被嵌入式Apach Derby实例使用的数据目录。
JDBC持久化适配器(JDBC消息仓库上的接口)中一个关键属性是dataSource 属性。这个属性定义了从哪个工厂进行关系数据库的连接。配置dataSource对象使JDBC持久化适配器能使用物理数据库而不是默认的。这里有一个使用MySql 数据库配置JDBC消息仓库的ActiveMQ配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<broker brokerName="test-broker"
persistent="true"
xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
</broker>
<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="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
</beans>
之前的示例使用Apache Commons DBCP BasicDataSource为连接池包装了MySQL JDBC驱动。在这个示例中,driverClassName是使用的JDBC驱动。一些你能配置的属性被直接发送到数据库驱动它本身。例如,maxActive是一个MySQL数据库连接器的属性,它告诉数据库同时持有多少个活跃的连接。
作为一个对比,这是由一个使用Oracle数据库的配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<broker brokerName="test-broker"
persistent=true
xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#oracle-ds"/>
</persistenceAdapter>
</broker>
<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
</beans>
这个示例使用 Apache Commons DBCP BasicDataSource为连接池包装Oracle JDBC驱动。
现在JDBC消息仓库的一些配置示例已经展示了,你可能要问,什么时候最好使用这种类型的持久化?

5.4.4和ActiveMQ日报一起使用JDBC消息仓库
虽然JDBC消息仓库的性能并不完美,但是它能通过使用ActiveMQ日报来提高。日报确保了JMS事务的相容性。因为它包含了缓存技术的快速消息写操作,它能显著地提高ActiveMQ代理的性能。
这里有一个在JDBC(aka journaled JDBC)中使用日报的配置示例。在这个示例中Apache Derby正在被使用。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<broker brokerName="test-broker"
xmlns="http://activemq.apache.org/schema/core">
<persistenceFactory>
<journalPersistenceAdapterFactory
journalLogFiles="4"
journalLogFileSize="32768"
useJournal="true"
useQuickJournal="true"
dataSource="#derby-ds"
dataDirectory="activemq-data" />
</persistenceFactory>
</broker>
<bean id="derby-ds" class="org.apache.derby.jdbc.EmbeddedDataSource">
<property name="databaseName" value="derbydb"/>
<property name="createDatabase" value="create"/>
</bean>
</beans>
日报能被任何JDBC数据源使用,但是知道它应该和不应该在哪些时候使用是重要的。
在使用基础的JDBC时消息仓库日报提供了相当大的性能优点,特别是在同地部署JDBC数据库和ActiveMQ代理。唯一不可能使用日报的时候是在一个共享数据库master/slave配置中。因为从master来的消息可能在提交到数据库之前被本地存储于日报中,若在这个配置中使用日报,如果master挂了可能导致丢失消息因为日报没有被复制。
我们通过配置示例已经讲解了在关系数据库中的消息仓库。在下一节我们将看看内存仓库,它不会存留消息。