为啥休眠 5.3 不支持带有 infinispan 的事务缓存

Posted

技术标签:

【中文标题】为啥休眠 5.3 不支持带有 infinispan 的事务缓存【英文标题】:Why does hibernate 5.3 not support transactional caches with infinispan为什么休眠 5.3 不支持带有 infinispan 的事务缓存 【发布时间】:2021-05-25 00:24:02 【问题描述】:

亲爱的 Infinispan 社区

我在 EAP 和 Spring 部署中运行应用程序。在将依赖项从 EAP 7.1 迁移到 EAP 7.2 后,我在 spring 模式下收到警告:HHH025030: Transactional caches are not supported. The configuration option will be ignored; please unset 在 infinispan.xml 中使用事务标签时 - 这同样适用于 local-cache-configuration 或 invalidation-cache-configuration

<local-cache-configuration name="my-region">
    <transaction mode="NON_DURABLE_XA" transaction-manager-lookup="org.infinispan.transaction.lookup.JBossStandaloneJTAManagerLookup"/>
    <expiration ... />
    <memory>
        <object size="..." strategy="LRU" />
    </memory>
</local-cache-configuration>

<!-- OR -->

<invalidation-cache-configuration name="my-region">
    <locking concurrency-level="32" acquire-timeout="15000"/>
    <transaction mode="NON_DURABLE_XA" transaction-manager-lookup="org.infinispan.transaction.lookup.JBossStandaloneJTAManagerLookup"/>
    <expiration ... />
    <memory>
        <object size="..." strategy="LRU" />
    </memory>
</invalidation-cache-configuration>

我发现ticket 说 EAP 应该删除交易标签,但没有解释原因。 我找到的最接近的解释是在拉取请求 infinispan!5900 的评论中,上面写着 v53 drops support for transactional caches completely.,但 Hibernate 5.3.20.Final 或 5.4.28.Final 的文档没有提及任何相关内容,仍然列出了事务并发策略。

Infinispan 配置不支持事务标签对 hibernate 2LC 有什么影响?

我的用例关心实体的 2LC 缓存是否在 行被提交到 DB 之后失效(表现得像事务级别读取提交的 SQL 查询)。如果事务 T1 将版本 V1 中的实体更新到 V2,则事务 T2 应继续使用实体 V1,直到事务 T1 在 DB 中提交。如果事务 T1 回滚,那么触发缓存失效对我来说仍然没问题,因为我不使用复制缓存,而是使用失效缓存。

我使用带有注释org.hibernate.annotations.Cache(region = "my-region", usage = CacheConcurrencyStrategy.TRANSACTIONAL)的实体。

在这种情况下我应该使用哪种并发策略以及如何配置 Infinispan 缓存?

CacheConcurrencyStrategy.TRANSACTIONAL 策略是否使用 XA 资源在行被提交到 DB 之后清理缓存。

是否有文档或测试 Infinispan 在 hibernate 2LC 的这种边缘情况下的行为?

版本:EAP 7.2 / Spring 5.x - hibernate-core:5.3.15.Final-redhat-00001, infinispan-hibernate-cache-v53:9.3.8.Final-redhat-00001

【问题讨论】:

【参考方案1】:

我不熟悉 Hibernate 2LC 集成。 Infinispan documentation 说(链接中有完整的上下文):

Infinispan provides the same consistency guarantees for both transactional and read-write strategies, use of transactions is considered an implementation detail.

对你有帮助吗?

【讨论】:

感谢@pruivo 我浏览了各种文档,但错过了该部分。我相信缓存失效发生在数据库提交后触发的一些休眠侦听器上,我很高兴找到文档 - 它显示了陈旧读取非严格读写的示例,但最好了解读写如何防止这种情况(这是应该更严格)。我会将这个问题留待一段时间,看看是否有人要补充。 该链接显示“Hibernate 支持仅 JDBC 事务” - 但 hibernate 可以使用 XA DB 连接与 XA JMS 连接一起工作,但通常没有提到在此类设置中以 XA 模式配置 2LC。 @kodstark 该注释仅适用于 Hibernate @DanBerindei 这是否意味着如果 Hibernate 5.3 配置为与 JMS 一起工作的 XA 数据源,我应该期望“HHH025030:不支持事务缓存”这一行不会出现在日志中? @kodstark 我只是在谈论那条注释,上面写着“仅在 JTA 环境中才能使用事务缓存。Hibernate 支持仅 JDBC 事务,但 Infinispan 事务缓存不与这些集成。”这意味着事务缓存在 Hibernate

以上是关于为啥休眠 5.3 不支持带有 infinispan 的事务缓存的主要内容,如果未能解决你的问题,请参考以下文章

Infinispan/hibernate 2 级缓存更新不是事务性的?

WildFly8.2.0.Final、Hibernate、Infinispan:org.hibernate.cache.CacheException:不支持的访问类型 [读写]

带有 Hibernate Search + Infinispan 目录的事务 ACID 属性

Infinispan 12:带有自签名证书的 CLI

带有 Infinispan 目录提供程序的 Hibernate Search 6

Infinispan 是不是支持像 Redis 这样的结构化值的原生操作?