6.11. 基于 JDBC 字符串的缓存存储
基于 JDBC 字符串的缓存存储 JdbcStringBasedStore,使用 JDBC 驱动程序在底层数据库中加载和存储值。
基于 JDBC 字符串的缓存存储:
- 在表格中,将每个条目存储在其自己的行中,以增加并发负载的吞吐量。
-
使用简单的单对一映射,利用
key-to-string-mapper接口将每个键映射到String对象。
Data Grid 提供处理原语类型的默认实施DefaultTwoWayKey2StringMapper。
除了用于存储缓存条目的 data 表外,存储还会创建一个用于存储元数据的 _META 表。此表用于确保任何现有数据库内容与当前的 Data Grid 版本和配置兼容。
默认情况下,Data Grid 共享不存储,这意味着集群中的每个节点上的所有节点都写入底层存储。如果您希望操作只写入底层数据库一次,您必须将 JDBC 存储配置为共享。
分段
JdbcStringBasedStore 默认使用分段,并要求数据库表中的列表示条目所属的片段。
6.11.1. 配置基于 JDBC 字符串的缓存存储 复制链接链接已复制到粘贴板!
使用可以连接到数据库的基于 JDBC 字符串的缓存存储配置 Data Grid 缓存。
先决条件
-
远程缓存:将数据库驱动程序复制到 Data Grid Server 安装中的
server/lib目录。 嵌入式缓存:将
infinispan-cachestore-jdbc依赖项添加到pom文件中。<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-cachestore-jdbc</artifactId> </dependency>
流程
使用以下方法之一创建基于 JDBC 字符串的缓存存储配置:
声明性地添加
persistence元素或字段,然后使用以下 schema 命名空间添加string-keyed-jdbc-store:xmlns="urn:infinispan:config:store:jdbc:15.0"以编程方式,将以下方法添加到
ConfigurationBuilder中:persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class)
-
使用 dialect 属性或
方法指定数据库的 dialect。dialect() 根据情况,配置基于 JDBC 字符串的缓存存储的任何属性。
例如,指定缓存存储是否使用
shared属性或shared ()方法与多个缓存实例共享。- 添加 JDBC 连接工厂,以便 Data Grid 可以连接到数据库。
- 添加存储缓存条目的数据库表。
使用不当的数据类型配置 string-keyed-jdbc-store 可能会导致加载或存储缓存条目时出现异常。如需更多信息,以及作为 Data Grid 版本一部分测试的数据类型列表,请参阅为 Data Grid string-keyed-jdbc-store persistence (Login required)测试的数据库设置。
基于 JDBC 字符串的缓存存储配置
XML
<distributed-cache>
<persistence>
<string-keyed-jdbc-store xmlns="urn:infinispan:config:store:jdbc:15.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");