6.10.2. 从数据库表载入 Data Grid 缓存
如果您希望数据网格从数据库表中加载数据,请在配置中添加 SQL 表缓存存储。当它连接到数据库时,Data Grid 使用表中的元数据来检测列名称和数据类型。数据网格还自动决定数据库中哪些列是主密钥的一部分。
先决条件
-
具有 JDBC 连接详情。
您可以将 JDBC 连接工厂直接添加到您的缓存配置中。
对于生产环境中的远程缓存,您应该将受管数据源添加到 Data Grid Server 配置中,并在缓存配置中指定 JNDI 名称。 为任何复合密钥或复合值生成 Protobuf 模式,并使用 Data Grid 注册您的模式。
提示数据网格建议使用 Protobuf 处理器生成 Protobuf 模式。对于远程缓存,您可以通过数据网格控制台、CLI 或 REST API 来添加模式来注册模式。
流程
在 Data Grid 部署中添加数据库驱动程序。
-
远程缓存:将数据库驱动程序复制到 Data Grid 服务器安装的
server/lib目录中。 嵌入式缓存:在您的
pom文件中添加infinispan-cachestore-sql依赖项。<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-cachestore-sql</artifactId> </dependency>
-
远程缓存:将数据库驱动程序复制到 Data Grid 服务器安装的
- 打开 Data Grid 配置进行编辑。
添加 SQL 表缓存存储。
声明性
table-jdbc-store xmlns="urn:infinispan:config:store:sql:13.0"
programmatic
persistence().addStore(TableJdbcStoreConfigurationBuilder.class)
-
使用
dialect=""或dialect ()指定数据库死信,如dialect="H2"或dialect="postgres"。 使用您需要的属性配置 SQL 缓存存储,例如:
-
要在集群中使用相同的缓存存储,请设置
shared="true"或shared (true)。 -
要创建只读缓存存储,请设置
read-only="true"或.ignoreModifications (true)。
-
要在集群中使用相同的缓存存储,请设置
-
使用 table
-name="<database_table_name>" 或 table.name("<database_table_name>")来加载缓存的数据库表。 添加
schema元素或.schemaJdbcConfigurationBuilder ()方法,并为复合键或值添加 Protobuf 模式配置。-
使用 package 属性或
方法指定软件包名称。package() -
使用
message-name属性或messageName ()方法指定复合值。 -
使用
key-message-name属性或keyMessageName ()方法指定复合键。 -
如果您的 schema 包含值 in values 中的键,则为
方法设置值嵌入式-key属性或嵌入式Key ()true。
-
使用 package 属性或
- 保存对您的配置的更改。
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");