【问题标题】:Is it possible to manully add values to Hibernate query cache map?是否可以手动将值添加到 Hibernate 查询缓存映射?
【发布时间】:2017-07-22 16:49:24
【问题描述】:

是否可以手动添加键到 Hibernate 查询缓存的映射?

请看下面我的推理:

我有一个查询如下:

from UserTable as u where u.username="Dan" and password="123456"

结果查询返回一个 id 为 3 的用户。

第一个查询只执行一次,并加载到查询缓存中。

现在,当第一个结果被缓存时,我发出以下查询

from UserTable as u where u.id=3

这将返回相同的用户,但正如我从各个站点like so 了解到的那样,查询将被缓存完全视为不同的查询(如果我错了,请纠正我当然)。

有没有办法告诉 Hibernate 两个查询返回相同的数据?这样做可以避免休眠第二次访问数据库。

我能想到的一个理论上的解决方案是,在发出第一个查询后,将第二个查询与第一个查询值注入缓存,但我不确定这是否可能。

【问题讨论】:

    标签: java hibernate caching hql second-level-cache


    【解决方案1】:

    有没有办法告诉 Hibernate 两个查询返回相同的数据? 没有。

    这样做可以避免休眠第二次访问数据库。 这应该没什么大不了的。查询缓存旨在用于经常执行的查询,因此多执行一次应该不会产生太大影响。

    我能想到的一个理论上的解决方案是,在发出第一个查询之后,将第二个查询与第一个查询值一起注入缓存,但我不确定这是否可能。 理论上是可以的,但是手动实现会非常复杂(缓存条目格式、时间戳缓存、与其他并发会话的正确同步等)。

    您的具体示例的解决方案是为UserTable 实体启用二级缓存,并使用session.load(UserTable.class, id) 加载用户,而不是执行第二个查询。这样用户将从二级缓存中检索,因为它是在第一个查询中加载到其中的。

    重要提示:如果您有大量 UserTable 实体的记录,则您的任何查询和 UserTable 实体都不应被缓存。查看blog,了解有关 L2 缓存的概述和最佳实践。

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多