gpt4 book ai didi

java - Hibernate 查询返回陈旧数据

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:37 24 4
gpt4 key购买 nike

我有一个仅从数据库读取数据的 hibernate 查询 (hibernate 3)。数据库由单独的应用程序更新,查询结果不反射(reflect)数据库中的更改。

经过一些研究,我认为它可能与 Hibernate L2 缓存有关(我不认为它是 L1 缓存,因为我总是打开一个新 session 并在完成后关闭它)。

Session session = sessionFactoryWrapper.getSession();
List<FlowCount> result = session.createSQLQuery(flowCountSQL).list();
session.close();

我尝试在 hibernate 配置文件中禁用第二层缓存,但它不起作用:

<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.use_query_cache">false</property>
<propertyname="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

我还在 Session session = sessionFactoryWrapper.getSession(); 之后添加了 session.setCacheMode(CacheMode.Refresh); 以强制刷新 L1 缓存,但仍然没有工作...

是否有另一种方法来获取数据库中的更改?我在如何禁用缓存方面做错了什么吗?谢谢。

更新:我通过监控数据库查询日志做了另一个实验:

  1. 第一次运行代码。检查日志。出现查询。
  2. 等几分钟。数据已被另一个应用程序更改。我通过 MySql Workbench 验证了它。为了与之前的查询区分开来,我添加了一个虚拟条件。
  3. 第二次运行代码。检查日志并显示查询。

两次我都使用相同的查询,但由于数据已更改,结果应该不同但不知何故不是...

最佳答案

为了强制刷新 L1 缓存,您可以使用 session 的 refresh(Object) 方法。

来自 Hibernate 文档,

Re-read the state of the given instance from the underlying database. It is inadvisable to use this to implement long-running sessions that span many business tasks. This method is, however, useful in certain special circumstances. For example

  • where a database trigger alters the object state upon insert or update
  • after executing direct SQL (eg. a mass update) in the same session
  • after inserting a Blob or Clob

此外,您提到您添加了 session.setCacheMode(CacheMode.Refresh) 以强制刷新 L1 缓存。这是行不通的,因为 CacheMode 不需要对 L1 缓存做任何事情。再次来自 Hibernate 文档,

CacheMode controls how the session interacts with the second-level cache and query cache.

关于java - Hibernate 查询返回陈旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30353206/

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