JDBC 元数据存储

版本 5.0 引入了 JDBC MetadataStore(参见 元数据存储)实现。您可以使用 JdbcMetadataStore 来维护跨应用重启的元数据状态。这个 MetadataStore 实现可以与以下适配器一起使用:

要配置这些适配器使用 JdbcMetadataStore,请声明一个 Spring bean,其 bean 名称为 metadataStore。Feed 入站通道适配器和 Feed 入站通道适配器都会自动检测并使用已声明的 JdbcMetadataStore,如下例所示:

@Bean
public MetadataStore metadataStore(DataSource dataSource) {
    return new JdbcMetadataStore(dataSource);
}

org.springframework.integration.jdbc 包包含针对多种 RDMBS 厂商的数据库 schema 脚本。例如,以下列表显示了元数据表的 H2 DDL:

CREATE TABLE INT_METADATA_STORE  (
	METADATA_KEY VARCHAR(255) NOT NULL,
	METADATA_VALUE VARCHAR(4000),
	REGION VARCHAR(100) NOT NULL,
	constraint INT_METADATA_STORE_PK primary key (METADATA_KEY, REGION)
);

您可以更改 INT_ 前缀以匹配目标数据库设计要求。您也可以配置 JdbcMetadataStore 使用自定义前缀。

JdbcMetadataStore 实现了 ConcurrentMetadataStore 接口,使其能够可靠地在多个应用实例间共享,其中只有一个实例可以存储或修改键的值。所有这些操作都是原子的,这得益于事务保证。

事务管理必须使用 JdbcMetadataStore。可以在轮询器配置中为入站通道适配器提供 TransactionManager 的引用。与非事务性 MetadataStore 实现不同,使用 JdbcMetadataStore 时,条目仅在事务提交后才会出现在目标表中。发生回滚时,不会向 INT_METADATA_STORE 表中添加任何条目。

自版本 5.0.7 起,您可以为 JdbcMetadataStore 配置特定于 RDMBS 厂商的 lockHint 选项,用于对元数据存储条目进行基于锁的查询。默认情况下,它是 FOR UPDATE,如果目标数据库不支持行锁定功能,则可以配置为空字符串。请咨询您的厂商,了解在 SELECT 表达式中锁定行(更新前)的特定和可能的提示。