6.11. JDBC 字符串的缓存存储

JDBC String 型缓存存储 JdbcStringBasedStore,使用 JDBC 驱动程序在底层数据库中加载和存储值。

JDBC String-Based 缓存存储:

  • 将每个条目存储在表中,以提高并发负载吞吐量。
  • 使用一个简单的一对一映射,使用键到 字符串接口将每个键 映射到 String 对象。
    数据网格提供了一个处理原语类型的默认实施 DefaultTwoWayKey2StringMapper

除了用于存储缓存条目的数据表外,存储还会创建一个 _META 表来存储元数据。此表用于确保任何现有数据库内容与当前数据网格版本和配置兼容。

注意

默认情况下,Data Grid 共享不存储,这意味着集群中的所有节点都写入每个更新上的底层存储。如果只想操作对底层数据库进行写入,则必须将 JDBC 存储配置为共享。

分段

JdbcStringBasedStore 默认使用分段,它需要一个数据库表中的列来代表条目属于的片段。

6.11.1. 配置基于字符串的 JDBC 缓存存储

使用 JDBC 字符串的缓存配置可连接到数据库的数据网格缓存。

先决条件

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

    <dependency>
      <groupId>org.infinispan</groupId>
      <artifactId>infinispan-cachestore-jdbc</artifactId>
    </dependency>

流程

  1. 使用以下方法之一创建基于 JDBC 字符串的缓存存储配置:

    • 声明性,添加 持久性 元素或字段,然后添加带有以下架构命名空间的 string-keyed-jdbc-store

      xmlns="urn:infinispan:config:store:jdbc:13.0"
    • 以编程方式,将以下方法添加到 ConfigurationBuilder 中:

      persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class)
  2. 使用 dialect 属性或 dialect () 方法指定数据库的 dialect。
  3. 根据情况配置 JDBC 字符串的缓存存储的任何属性。

    例如,指定缓存存储是否与带有 shared 属性或 shared () 方法的多个缓存实例共享。

  4. 添加 JDBC 连接工厂,使数据网格能够连接到数据库。
  5. 添加存储缓存条目的数据库表。
JDBC 字符串的缓存存储配置

XML

<distributed-cache>
  <persistence>
    <string-keyed-jdbc-store xmlns="urn:infinispan:config:store:jdbc:13.0"
                             dialect="H2">
      <connection-pool connection-url="jdbc:h2:mem:infinispan"
                       username="sa"
                       password="changeme"
                       driver="org.h2.Driver"/>
      <string-keyed-table create-on-start="true"
                          prefix="ISPN_STRING_TABLE">
        <id-column name="ID_COLUMN"
                   type="VARCHAR(255)" />
        <data-column name="DATA_COLUMN"
                     type="BINARY" />
        <timestamp-column name="TIMESTAMP_COLUMN"
                          type="BIGINT" />
        <segment-column name="SEGMENT_COLUMN"
                        type="INT"/>
      </string-keyed-table>
    </string-keyed-jdbc-store>
  </persistence>
</distributed-cache>

JSON

{
  "distributed-cache": {
    "persistence": {
      "string-keyed-jdbc-store": {
        "dialect": "H2",
        "string-keyed-table": {
          "prefix": "ISPN_STRING_TABLE",
          "create-on-start": true,
          "id-column": {
            "name": "ID_COLUMN",
            "type": "VARCHAR(255)"
          },
          "data-column": {
            "name": "DATA_COLUMN",
            "type": "BINARY"
          },
          "timestamp-column": {
            "name": "TIMESTAMP_COLUMN",
            "type": "BIGINT"
          },
          "segment-column": {
            "name": "SEGMENT_COLUMN",
            "type": "INT"
          }
        },
        "connection-pool": {
          "connection-url": "jdbc:h2:mem:infinispan",
          "driver": "org.h2.Driver",
          "username": "sa",
          "password": "changeme"
        }
      }
    }
  }
}

YAML

distributedCache:
  persistence:
    stringKeyedJdbcStore:
      dialect: "H2"
      stringKeyedTable:
        prefix: "ISPN_STRING_TABLE"
        createOnStart: true
        idColumn:
          name: "ID_COLUMN"
          type: "VARCHAR(255)"
        dataColumn:
          name: "DATA_COLUMN"
          type: "BINARY"
        timestampColumn:
          name: "TIMESTAMP_COLUMN"
          type: "BIGINT"
        segmentColumn:
          name: "SEGMENT_COLUMN"
          type: "INT"
      connectionPool:
        connectionUrl: "jdbc:h2:mem:infinispan"
        driver: "org.h2.Driver"
        username: "sa"
        password: "changeme"

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class)
      .dialect(DatabaseType.H2)
      .table()
         .dropOnExit(true)
         .createOnStart(true)
         .tableNamePrefix("ISPN_STRING_TABLE")
         .idColumnName("ID_COLUMN").idColumnType("VARCHAR(255)")
         .dataColumnName("DATA_COLUMN").dataColumnType("BINARY")
         .timestampColumnName("TIMESTAMP_COLUMN").timestampColumnType("BIGINT")
         .segmentColumnName("SEGMENT_COLUMN").segmentColumnType("INT")
      .connectionPool()
         .connectionUrl("jdbc:h2:mem:infinispan")
         .username("sa")
         .password("changeme")
         .driverClass("org.h2.Driver");

其他资源