版本 4.3 引入了 . 某些组件(例如,聚合器和重排序器)使用从实例获取的锁来确保一次只有一个线程操作一个组。 在单个组件中执行此功能。 您现在可以在这些组件上配置外部锁注册表。 当与共享 一起使用时,可以使用 跨多个应用程序实例提供此功能,以便一次只能有一个实例操作该组。JdbcLockRegistryLockRegistryDefaultLockRegistryMessageGroupStoreJdbcLockRegistrySpring中文文档

当一个锁被本地线程释放时,另一个本地线程通常可以立即获取该锁。 如果使用其他注册表实例的线程释放了锁,则最多可能需要 100 毫秒才能获取锁。Spring中文文档

它基于抽象,它有一个实现。 数据库架构脚本位于包中,该包针对特定的 RDBMS 供应商进行划分。 例如,以下列表显示了锁表的 H2 DDL:JdbcLockRegistryLockRepositoryDefaultLockRepositoryorg.springframework.integration.jdbcSpring中文文档

CREATE TABLE INT_LOCK  (
    LOCK_KEY CHAR(36),
    REGION VARCHAR(100),
    CLIENT_ID CHAR(36),
    CREATED_DATE TIMESTAMP NOT NULL,
    constraint INT_LOCK_PK primary key (LOCK_KEY, REGION)
);

可以根据目标数据库的设计要求进行更改。 因此,必须在 Bean 定义上使用属性。INT_prefixDefaultLockRepositorySpring中文文档

有时,一个应用程序已移动到无法释放分布式锁并删除数据库中的特定记录的状态。 为此,其他应用程序可以在下一次锁定调用时使此类死锁过期。 为此目的提供了 (TTL) 选项。 您可能还希望为给定实例指定存储的锁。 如果是这样,可以指定要与 关联的 作为构造函数参数。timeToLiveDefaultLockRepositoryCLIENT_IDDefaultLockRepositoryidDefaultLockRepositorySpring中文文档

从版本 5.1.8 开始,可以使用 - a 配置为在锁定记录插入/更新执行之间休眠。 默认情况下,它是毫秒,在某些环境中,非领导者会经常污染与数据源的连接。JdbcLockRegistryidleBetweenTriesDuration100Spring中文文档

从 5.4 版开始,该接口已被引入并添加到 . 该方法必须在锁定进程期间调用,以防锁定进程的存续时间超过锁定的生存时间。 因此,生存时间可以大大缩短,部署可以快速夺回丢失的锁。RenewableLockRegistryJdbcLockRegistryrenewLock()Spring中文文档

仅当锁由当前线程保持时,才能进行锁续订。
仅当锁由当前线程保持时,才能进行锁续订。

从版本 5.5.6 开始,支持通过 自动清理 JdbcLock 的缓存。 有关更多信息,请参阅其 JavaDocs。JdbcLockRegistryJdbcLockRegistry.locksJdbcLockRegistry.setCacheCapacity()Spring中文文档

从 V6.0 开始,可以提供 a 而不是依赖于应用程序上下文中的主 bean。DefaultLockRepositoryPlatformTransactionManagerSpring中文文档

从版本 6.1 开始,可以为自定义 和查询配置 。 为此,暴露了各自的 setter 和 getter。 例如,PostgreSQL 提示的插入查询可以按如下方式配置:DefaultLockRepositoryinsertupdaterenewSpring中文文档

lockRepository.setInsertQuery(lockRepository.getInsertQuery() + " ON CONFLICT DO NOTHING");