【问题标题】:Usage of 2nd level cache entity with hibernate 5.2在休眠 5.2 中使用二级缓存实体
【发布时间】:2018-05-22 15:56:03
【问题描述】:

我最近将我的 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 辅助选择。

但是,当我一次加载多个 CHILD(使用 from CHILD 之类的查询)时,不使用 PARENT 缓存。如果我再次执行查询,则会重复第二个 PARENT 选择。

这是表演的一大损失。有没有人遇到过同样的问题?我错过了一些配置部分吗?

感谢您的帮助。

【问题讨论】:

    标签: java hibernate caching


    【解决方案1】:

    在我花了更多时间解决这个问题后,我发现它是由在 read many CHILDs 之前执行的本机查询引起的。此原生查询在数据库会话 (SET LOCAL TIME ZONE '<TIMEZONEID>') 中设置了一个参数,该参数用于对用户时区中的日期进行一些计算。

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

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

    【讨论】:

    猜你喜欢
    • 2014-01-12
    • 2010-11-26
    • 2015-04-27
    • 2010-10-20
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多