搜索

6.2. 在数据库中持久保留消息数据

download PDF

当您在数据库中持久保留消息数据时,代理使用 Java 数据库连接 (JDBC)连接将消息和绑定数据存储在数据库表中。表中的数据使用 AMQ Broker 日志编码进行编码。有关支持的数据库的详情,请参考红帽客户门户网站中的 Red Hat AMQ 7 支持的配置

重要

管理员可以选择根据组织更广泛的 IT 基础架构要求将消息数据存储在数据库中。但是,使用数据库可能会对消息传递系统性能造成负面影响。具体来说,通过 JDBC 将消息传递数据写入数据库表可为代理创建显著的性能开销。

6.2.1. 配置 JDBC 持久性

以下流程演示了如何配置代理,以在数据库表中存储消息和绑定数据。

流程

  1. 将适当的 JDBC 客户端库添加到代理运行时。要做到这一点,将相关的 .JAR 文件添加到 < broker_instance_dir>/lib 目录中。

    如果要将 .JAR 文件添加到不同的目录中,您必须将该目录添加到 Java 类路径中。如需更多信息,请参阅 第 1.5 节 “扩展 JAVA 类路径”

  2. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  3. core 元素中,添加一个包含 database-store 元素的 store 元素。

    <configuration>
      <core>
        <store>
           <database-store>
           </database-store>
        </store>
      </core>
    </configuration>
  4. 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 配置中的值。如需更多信息,请参阅 默认连接池配置

先决条件

流程

  1. 打开 & lt;broker-instance-dir&gt; /etc/broker.xml 配置文件。
  2. 在您之前为 JDBC 配置添加的 database-store 元素中,删除 jdbc-driver-class-namejdbc-connection-urljdbc-userjdbc-password、参数。在此过程中,您要将它们替换为对应的 DBCP 配置参数。

    注意

    如果您没有显式删除上述参数,则您稍后添加的对应 DBCP 参数具有优先权。

  3. 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>
  4. 在新的 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
    您的数据库服务器的加密用户名。您还可以将这个值指定为 unencrypted, plain text。有关加密在配置文件中使用的用户名和密码的详情请参考 第 5.9 节 “在配置文件中加密密码”
    password
    您的数据库服务器的加密密码。您还可以将这个值指定为 unencrypted, plain text。有关加密在配置文件中使用的用户名和密码的详情请参考 第 5.9 节 “在配置文件中加密密码”
    poolPreparedStatements
    当此参数的值设为 true 时,池可以有无限数量的缓存准备语句。这降低了初始化成本。
    maxTotal
    池中连接的最大数量。当此参数的值设为 -1 时,没有限制。

如果您没有显式配置 JDBC 连接池,代理将使用与默认配置的连接池。表中描述了默认配置。

表 6.1. 默认连接池配置
DBCP 配置参数默认值

driverClassName

现有 jdbc-driver-class-name 参数的值

url

现有 jdbc-connection-url 参数的值

username

现有 jdbc-user 参数的值

password

现有 jdbc-password 参数的值

poolPreparedStatements

true

maxTotal

-1

注意

只有 没有客户端正在主动向代理发送消息时,重新连接才能正常工作。如果在重新连接过程中尝试写入数据库表,代理会失败并关闭。

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.