6.2. 在数据库中保留消息数据
当您将消息数据存储在数据库中时,代理使用 Java 数据库连接 (DSL)连接将消息和绑定数据存储在数据库表中。表中的数据使用 AMQ Broker 日志编码进行编码。有关支持的数据库的详情,请查看红帽客户门户网站中的 Red Hat AMQ 7 支持的配置。
管理员可以根据机构更广泛的 IT 基础架构的要求,选择将消息数据存储在数据库中。但是,使用数据库可能会对消息传递系统性能造成负面影响。具体来说,通过 JDBC 将消息传递数据写入数据库表会为代理产生显著的性能开销。
6.2.1. 配置 JDBC 持久性
以下流程演示了如何配置代理,以将消息和绑定数据存储在数据库表中。
流程
-
将适当的 JDBC 客户端库添加到代理运行时。要做到这一点,将相关的
.jar
文件添加到 <broker_instance_dir>/lib
目录中。 -
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
core
元素中,添加一个包含database-store
元素的store
元素。<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>BIND_TABLE</bindings-table-name> <message-table-name>MSG_TABLE</message-table-name> <large-message-table-name>LGE_TABLE</large-message-table-name> <page-store-table-name>PAGE_TABLE</page-store-table-name> <node-manager-store-table-name>NODE_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> <jdbc-max-page-size-bytes>100K</jdbc-max-page-size-bytes> </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 毫秒。
- jdbc-max-page-size-bytes
-
当 AMQ Broker 将消息保留到 JDBC 数据库时,每个页文件的最大大小(以字节为单位)。默认值为
102400
,其值为 100KB。您指定的值也支持字节表示法,如 "K" "MB" 和 "GB"。
6.2.2. 配置 JDBC 连接池
如果您已经为 JDBC 持久性配置了代理,代理使用 JDBC 连接将消息和绑定数据存储在数据库表中。
如果 JDBC 连接失败,并且提供在出现故障时没有活动连接活动(如数据库读取或写入),代理将保持运行并尝试重新建立数据库连接。为达到此目的,AMQ Broker 使用 JDBC 连接池。
通常,连接池 提供一组到指定数据库的打开连接,这些数据库可以在多个应用程序间共享。对于代理,如果代理和数据库之间的连接失败,代理会尝试使用与池不同的连接重新连接到数据库。池在代理接收前测试新连接。
以下示例演示了如何配置 JDBC 连接池。
如果您没有明确配置 JDBC 连接池,代理使用带有默认配置的连接池。默认配置使用现有 JDBC 配置中的值。如需更多信息,请参阅 默认连接池配置。
先决条件
- 这个示例基于配置 JDBC 持久性的示例构建。请查看 第 6.2.1 节 “配置 JDBC 持久性”
要启用连接池,AMQ Broker 使用 Apache Commons DBCP 软件包。在为代理配置 JDBC 连接池前,您应熟悉此软件包提供的内容。如需更多信息,请参阅:
流程
-
打开 &
lt;broker-instance-dir> /etc/broker.xml
配置文件。 在您之前为 JDBC 配置添加的
database-store
元素中,删除jdbc-driver-class-name
,jdbc-connection-url
,jdbc-user
,jdbc-password
, 参数。之后,您将把它们替换为对应的 DBCP 配置参数。注意如果您没有明确删除前面的参数,则在此流程中添加的对应 DBCP 参数将具有优先权。
在
database-store
元素中,添加一个data-source-properties
元素。例如:<store> <database-store> <data-source-properties> </data-source-properties> <bindings-table-name>BINDINGS</bindings-table-name> <message-table-name>MESSAGES</message-table-name> <large-message-table-name>LARGE_MESSAGES</large-message-table-name> <page-store-table-name>PAGE_STORE</page-store-table-name> <node-manager-store-table-name>NODE_MANAGER_STORE</node-manager-store-table-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>
在新的
data-source-properties
元素中,为连接池添加 DBCP 数据源属性。指定键值对。例如:<store> <database-store> <data-source-properties> <data-source-property key="driverClassName" value="com.mysql.jdbc.Driver" /> <data-source-property key="url" value="jdbc:mysql://localhost:3306/artemis" /> <data-source-property key="username" value="ENC(5493dd76567ee5ec269d1182397346f)"/> <data-source-property key="password" value="ENC(56a0db3b71043054269d1182397346f)"/> <data-source-property key="poolPreparedStatements" value="true" /> <data-source-property key="maxTotal" value="-1" /> </data-source-properties> <bindings-table-name>BINDINGS</bindings-table-name> <message-table-name>MESSAGES</message-table-name> <large-message-table-name>LARGE_MESSAGES</large-message-table-name> <page-store-table-name>PAGE_STORE</page-store-table-name> <node-manager-store-table-name>NODE_MANAGER_STORE</node-manager-store-table-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>
driverClassName
- JDBC 数据库驱动程序的完全限定类名称。
url
- 数据库服务器的完整 JDBC 连接 URL。
username
- 数据库服务器的加密用户名。您还可以将这个值指定为未加密的纯文本。有关加密用于配置文件的用户名和密码的详情,请参考 第 5.9 节 “在配置文件中加密密码”。
password
- 数据库服务器的加密密码。您还可以将这个值指定为未加密的纯文本。有关加密用于配置文件的用户名和密码的详情,请参考 第 5.9 节 “在配置文件中加密密码”。
poolPreparedStatements
-
当此参数的值设为
true
时,池可以有无限数量的缓存的声明。这可降低初始化成本。 maxTotal
-
池中连接的最大数量。当此参数的值设为
-1
时,没有限制。
如果您没有明确配置 JDBC 连接池,代理使用带有默认配置的连接池。表中描述了默认配置。
DBCP 配置参数 | 默认值 |
---|---|
|
现有 |
|
现有 |
|
现有 |
|
现有 |
|
|
|
|
只有在 没有客户端主动向代理发送信息时,重新连接才可以正常工作。如果尝试在重新连接过程中写入数据库表,代理会失败并关闭。
其他资源
- 有关 AMQ Broker 支持的数据库的详情,请查看红帽客户门户网站中的 Red Hat AMQ 7 支持的配置。
- 要了解 Apache Commons DBCP 软件包中所有可用的配置选项,请参阅 Apache Commons DBCP 配置参数。