如何在会话级别启用hibernate查询缓存?

Fra*_*See 6 session multithreading hibernate session-cache query-cache

如果我在一个线程中多次调用一个查询,我只想为该线程缓存该查询(及其结果)(或者因为我每个线程使用一个会话,因为该会话),该怎么办?我这样做?

注意:我的第二级缓存已打开,但它主要用于session.get(...).但是我不想将它用于我的查询缓存,因为我只需要它在我的线程(/ session)期间存活.

谢谢

Chs*_*y76 5

这里的底线是:您可以手动缓存查询结果,也可以让Hibernate执行此操作.虽然将查询缓存生存期限制为会话通常没有意义,但可以使用以下方法完成:

1)启用查询缓存

2)专门针对有问题的查询区域并将其标记为可缓存:

Query query = ...;
query.setCacheable(true).setCacheRegion("MY_SPECIAL_QUERY");
Run Code Online (Sandbox Code Playgroud)

3)在会话结束时从缓存中删除您的查询(如果您真的确定这是您想要做的):

SessionFactory sessionFactory = ...;
sessionFactory.evictQueries("MY_SPECIAL_QUERY");
Run Code Online (Sandbox Code Playgroud)


KLE*_*KLE 0

我不知道 Hibernate 有这样的功能。

但这似乎是一个非常有限且易于管理的环境。我会尝试这样做,这就是代码。乍一看似乎有多种方法:

  • 如果您的代码众所周知,那么复杂性是可以管理的。假设你有一个代码A,它调用代码B和C,它们都需要查询。您可以在 A 中运行一次查询,并将结果传递给 B 和 C。也许您已经有一个发送给 B 和 C 的上下文对象?那将是简单的、优雅的、有意义的……
  • 假设相反,您的代码确实一团糟,并且您无法传递上下文。您可以有一个包含结果的 ThreadLocal 变量。如果当前线程内未设置,则调用它并存储它。否则,只需将其检索即可。

    请注意,在第二种情况下,您必须在外出时负责清理 ThreadLocal。

  • 在这些对立面之间,解决方案是可能的,其中之一可能比其他更好......