6.2. 在数据库中持久保留消息数据
当您在数据库中持久保留消息数据时,代理使用 Java 数据库连接(JDBC )连接将消息和绑定数据存储在数据库表中。表中的数据使用 AMQ Broker 日志编码进行编码。有关支持的数据库的详情,请查看红帽客户门户网站 中的 Red Hat AMQ 7 支持的配置。
管理员可以根据组织更广泛的 IT 基础架构的要求,选择将消息数据存储在数据库中。但是,使用数据库会对消息传递系统的性能造成负面影响。具体来说,通过 JDBC 将消息传递数据写入数据库表可为代理带来显著的性能开销。
6.2.1. 配置 JDBC 持久性
以下流程演示了如何配置代理以在数据库表中存储消息和绑定数据。
流程
-
将适当的 JDBC 客户端库添加到代理运行时。为此,请将相关
.jar
文件添加到<broker_instance_dir>/lib
目录中。 -
打开
<broker_instance_dir>/etc/broker.xml
配置文件。 在
core
元素中,添加一个包含
数据库存储元素的 storage
元素。<configuration> <core> <store> <database-store> </database-store> </store> </core> </configuration>
在
database-store
元素中,添加 JDBC 持久性的配置参数并指定值。例如:<configuration> <core> <store> <database-store> <jdbc-connection-url>jdbc:oracle:data/oracle/database-store;create=true</jdbc-connection-url> <jdbc-user>ENC(5493dd76567ee5ec269d11823973462f)</jdbc-user> <jdbc-password>ENC(56a0db3b71043054269d11823973462f)</jdbc-password> <bindings-table-name>BINDINGS_TABLE</bindings-table-name> <message-table-name>MESSAGE_TABLE</message-table-name> <large-message-table-name>LARGE_MESSAGES_TABLE</large-message-table-name> <page-store-table-name>PAGE_STORE_TABLE</page-store-table-name> <node-manager-store-table-name>NODE_MANAGER_TABLE</node-manager-store-table-name> <jdbc-driver-class-name>oracle.jdbc.driver.OracleDriver</jdbc-driver-class-name> <jdbc-network-timeout>10000</jdbc-network-timeout> <jdbc-lock-renew-period>2000</jdbc-lock-renew-period> <jdbc-lock-expiration>20000</jdbc-lock-expiration> <jdbc-journal-sync-period>5</jdbc-journal-sync-period> </database-store> </store> </core> </configuration>
- jdbc-connection-url
- 数据库服务器的完整 JDBC 连接 URL。连接 URL 应当包含所有配置参数和数据库名称。
- jdbc-user
- 您的数据库服务器的加密用户名。有关加密配置文件中使用的用户名和密码的详情请参考 第 5.9 节 “加密配置文件中的密码”。
- jdbc-password
- 加密您的数据库服务器密码。有关加密配置文件中使用的用户名和密码的详情请参考 第 5.9 节 “加密配置文件中的密码”。
- bindings-table-name
- 存储绑定数据的表的名称。指定表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
- message-table-name
- 存储消息数据的表的名称。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
- large-message-table-name
- 保留大量消息和相关数据的表名称。此外,如果客户端以区块形式流传输大型消息,块将存储在这个表中。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
- page-store-table-name
- 存储目录信息的表的名称。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。
- node-manager-store-table-name
- 用于实时和备份代理的共享存储高可用性(HA)锁定及其他 HA 相关数据的表名称。指定此表名称可让您在多个服务器之间共享一个数据库,而无需干扰。使用共享存储 HA 的每个实时备份对必须使用相同的表名称。您不能在多个(不相关的)实时备份对间共享相同的表。
- jdbc-driver-class-name
- JDBC 数据库驱动程序的完全限定类名称。有关支持的数据库的详情,请查看红帽客户门户网站 中的 Red Hat AMQ 7 支持的配置。
- jdbc-network-timeout
-
JDBC 网络连接超时,以毫秒为单位.默认值为 20000 毫秒。将 JDBC 用于共享存储 HA 时,建议将超时设为小于或等于
jdbc-lock-expiration
的值。 - jdbc-lock-renew-period
-
当前 JDBC 锁定的续订期的时长,以毫秒为单位。当这次调整后,代理可以续订锁定。建议设置比
jdbc-lock-expiration
值小几个倍的值。这为代理提供了足够时间来扩展租期,并给予代理时间尝试在发生连接问题时续订锁定。默认值为 2000 毫秒。 - jdbc-lock-expiration
以毫秒为单位计算当前 JDBC 锁定的时间(即获取或续订),即使
jdbc-lock-renew-period
的值已经过期。代理定期尝试根据
jdbc-lock-renew-period
的值续订它拥有的锁定。如果代理 无法 续订锁定(例如,因为连接问题),代理会一直尝试续订锁定,直到自锁定上次成功获取或更新后通过jdbc-lock-expiration
的值。上述续订行为的例外是,当另一个代理获取锁定时。如果数据库管理系统(DBMS)和代理之间出现时间偏差,或者垃圾回收需要长时间暂停,则可能会发生这种情况。在这种情况下,最初拥有锁定的代理会认为锁定丢失,且不会尝试更新锁定。
在过期时间过后,如果 JDBC 锁定没有被当前拥有的代理续订,则另一个代理可以建立 JDBC 锁定。
jdbc-lock-expiration
的默认值为 20000 毫秒。- jdbc-journal-sync-period
- 代理日志与 JDBC 同步的持续时间,以毫秒为单位。默认值为 5 毫秒。