6.10.2. 从数据库表载入 Data Grid 缓存

如果您希望数据网格从数据库表中加载数据,请在配置中添加 SQL 表缓存存储。当它连接到数据库时,Data Grid 使用表中的元数据来检测列名称和数据类型。数据网格还自动决定数据库中哪些列是主密钥的一部分。

先决条件

  • 具有 JDBC 连接详情。
    您可以将 JDBC 连接工厂直接添加到您的缓存配置中。
    对于生产环境中的远程缓存,您应该将受管数据源添加到 Data Grid Server 配置中,并在缓存配置中指定 JNDI 名称。
  • 为任何复合密钥或复合值生成 Protobuf 模式,并使用 Data Grid 注册您的模式。

    提示

    数据网格建议使用 Protobuf 处理器生成 Protobuf 模式。对于远程缓存,您可以通过数据网格控制台、CLI 或 REST API 来添加模式来注册模式。

流程

  1. 在 Data Grid 部署中添加数据库驱动程序。

    • 远程缓存:将数据库驱动程序复制到 Data Grid 服务器安装的 server/lib 目录中。
    • 嵌入式缓存:在您的 pom 文件中添加 infinispan-cachestore-sql 依赖项。

      <dependency>
        <groupId>org.infinispan</groupId>
        <artifactId>infinispan-cachestore-sql</artifactId>
      </dependency>
  2. 打开 Data Grid 配置进行编辑。
  3. 添加 SQL 表缓存存储。

    声明性

    table-jdbc-store xmlns="urn:infinispan:config:store:sql:13.0"

    programmatic

    persistence().addStore(TableJdbcStoreConfigurationBuilder.class)

  4. 使用 dialect=""dialect () 指定数据库死信,如 dialect="H2"dialect="postgres"
  5. 使用您需要的属性配置 SQL 缓存存储,例如:

    • 要在集群中使用相同的缓存存储,请设置 shared="true"shared (true)
    • 要创建只读缓存存储,请设置 read-only="true".ignoreModifications (true)
  6. 使用 table -name="<database_table_name>" 或 table.name ("<database_table_name>")来加载缓存的 数据库表。
  7. 添加 schema 元素或 .schemaJdbcConfigurationBuilder () 方法,并为复合键或值添加 Protobuf 模式配置。

    1. 使用 package 属性或 package () 方法指定软件包名称。
    2. 使用 message-name 属性或 messageName () 方法指定复合值。
    3. 使用 key-message-name 属性或 keyMessageName () 方法指定复合键。
    4. 如果您的 schema 包含值 in values 中的键,则为 嵌入式-key 属性或嵌入式Key () 方法设置值 true
  8. 保存对您的配置的更改。
SQL 表存储配置

以下示例使用 Protobuf 模式中定义的复合值从名为"books"的数据库表中加载分布式缓存:

XML

<distributed-cache>
  <persistence>
    <table-jdbc-store xmlns="urn:infinispan:config:store:sql:13.0"
                      dialect="H2"
                      shared="true"
                      table-name="books">
      <schema message-name="books_value"
              package="library"/>
    </table-jdbc-store>
  </persistence>
</distributed-cache>

JSON

{
  "distributed-cache": {
    "persistence": {
      "table-jdbc-store": {
        "dialect": "H2",
        "shared": "true",
        "table-name": "books",
        "schema": {
          "message-name": "books_value",
          "package": "library"
        }
      }
    }
  }
}

YAML

distributedCache:
  persistence:
    tableJdbcStore:
      dialect: "H2"
      shared: "true"
      tableName: "books"
      schema:
        messageName: "books_value"
        package: "library"

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence().addStore(TableJdbcStoreConfigurationBuilder.class)
      .dialect(DatabaseType.H2)
      .shared("true")
      .tableName("books")
      .schemaJdbcConfigurationBuilder()
        .messageName("books_value")
        .packageName("library");