gpt4 book ai didi

java - Hibernate 5.2 中二级缓存实体的使用

转载 作者:行者123 更新时间:2023-11-30 06:23:12 25 4
gpt4 key购买 nike

我最近将我的 java 应用程序从 hibernate 4.1 升级到 hibernate 5.2,我注意到(通过查看 SQL 跟踪)二级实体缓存使用情况存在差异。缓存的使用频率不如以前的版本。

为了简单起见,假设我有一个非常基本的模型:一个与其 PARENT 具有多对一关系的 CHILD 实体。 PARENT 类用 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 进行注释。 。 CHILD 中的多对一关系用 @Fetch(FetchMode.SELECT) 注释。 。这应该让二级缓存有机会在获取 CHILD 时存储 PARENT。

当我加载单个 CHILD 实例(使用类似 from CHILD where id=:id 的查询)时,我看到使用了 PARENT 缓存。如果我再次执行查询,则 PARENT 辅助选择不会重复到数据库。

但是,当我一次加载多个子项(使用类似 from CHILD 的查询)时,不会使用父级缓存。如果我再次执行查询,则会重复辅助父级选择。

这是性能的巨大损失。有人遇到过同样的问题吗?我是否缺少一些配置部分?

感谢您的帮助。

最佳答案

在我花了更多时间解决这个问题后,我发现这是由在读取许多CHILD之前执行的 native 查询引起的。此 native 查询在数据库 session ( SET LOCAL TIME ZONE '<TIMEZONEID>' ) 中设置一个参数,该参数用于对用户时区中的日期进行一些计算。

读取CHILDs方法用@Transactional(readOnly = true)注释但在 session 中设置时区参数需要调用query.executeUpdate()尽管它不会改变实体。这似乎是导致缓存停止存储实体的原因。

我仍在寻找解决方法,但我知道它与特定的 hibernate 版本无关,也与一次读取一个或多个子项无关。

关于java - Hibernate 5.2 中二级缓存实体的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47713756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com