【问题标题】:How can I stop Java or Hibernate Caching如何停止 Java 或 Hibernate 缓存
【发布时间】:2016-03-13 18:24:24
【问题描述】:

我有一个应用程序可以从数据库中检索数据,并且我监控我的应用程序检索数据所花费的时间。

但是当我使用相同的数据输入集通过我的应用检索数据时,我遇到了一个问题,第二次检索将花费更少的时间。

我假设 Java 或 Hibernate 有一些缓存或临时文件来保存数据,所以第二次运行会很快,但我不希望它发生。我需要监控它实际花费的时间,而不是从缓存或临时文件中检索的时间。

我试图禁止在 Java 控制面板中生成缓存和临时文件,我试图禁用休眠缓存(一级或二级)。但是这些仍然不能解决我的问题。第二次运行所需的时间仍然少于应有的时间。

知道第二次跑得更快的原因吗?它只是一个从数据库中检索数据的简单应用程序

【问题讨论】:

  • 另外,根据您运行测试的方式,JVM 预热时间可能会对时间产生重大影响。

标签: java hibernate caching


【解决方案1】:

Hibernate 一级缓存无法禁用(请参阅How to disable hibernate caching)。如果要强制 Hibernate 查询数据库,则需要了解 Hibernate 的会话缓存。

Lokesh Gupta 在http://howtodoinjava.com/2013/07/01/understanding-hibernate-first-level-cache-with-example/ 上有一个很好的教程

  1. 一级缓存与“会话”对象和其他 应用程序中的会话对象看不到它。
  2. 缓存对象的范围是会话的。会话关闭后, 缓存的对象永远消失了。
  3. 一级缓存默认启用,您不能禁用它
  4. 当我们第一次查询一个实体时,它是从数据库中检索出来的 并存储在与休眠会话关联的一级缓存中。
  5. 如果我们用相同的会话对象再次查询相同的对象它将是 从缓存中加载,不会执行任何 sql 查询。
  6. 可以使用 evict() 方法从会话中删除加载的实体。 该实体的下一次加载将再次进行数据库调用,如果 它已使用 evict() 方法删除。
  7. 可以使用 clear() 方法删除整个会话缓存。它会 删除缓存中存储的所有实体。

因此,您应该使用evict()clear() 方法来强制查询数据库。

为了验证这一点,您可以使用 hibernate.show_sql 配置属性打开 SQL 输出(请参阅 https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html#configuration-optional)。

【讨论】:

    【解决方案2】:

    您是否尝试过禁用数据库本身的缓存?

    我相信 Hibernate 一级和二级缓存是特定于 Hibernate 的,但数据库仍会在后台缓存。

    MySQL - force not to use cache for testing speed of query

    【讨论】:

    • 不是我没有,我现在试试,谢谢
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多