如何停止Java或Hibernate缓存

时间:2015-12-08 17:46:32

标签: java hibernate caching

我有一个从数据库中检索数据的应用程序,我会监控应用程序检索数据所需的时间。

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

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

我试图禁止在Java控制面板中生成缓存和临时文件,我试图禁用hibernate缓存(第一级或第二级)。但这些仍然无法解决我的问题。第二次运行时间仍然比应该花费的时间少。

任何想法导致第二次跑得更快的原因?它只是一个从DB

中检索数据的简单应用程序

2 个答案:

答案 0 :(得分:5)

无法禁用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. 默认启用第一级缓存,无法禁用
  6.   
  7. 当我们第一次查询实体时,会从数据库中检索它   并存储在与hibernate会话关联的第一级缓存中。
  8.   
  9. 如果我们再次使用相同的会话对象查询同一个对象将会是   从缓存加载,不会执行任何SQL查询。
  10.   
  11. 可以使用evict()方法从会话中删除加载的实体。   如果下一个加载此实体将再次进行数据库调用   它已被使用evict()方法删除。
  12.   
  13. 可以使用clear()方法删除整个会话缓存。它会   删除存储在缓存中的所有实体。
  14.   

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

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

答案 1 :(得分:2)

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

我相信Hibernate的第一级和第二级缓存都是特定于Hibernate的,但数据库仍然会被隐藏起来。

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