为啥休眠 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 属性