我有一个从数据库中检索数据的应用程序,我会监控应用程序检索数据所需的时间。
但是当我使用相同的数据输入集来检索我的应用程序的数据时,我遇到了问题,第二次检索将花费更少的时间。
我认为Java或Hibernate有一些缓存或临时文件来保存数据,所以第二次运行会很快,但我不希望它发生。我需要监视它实际需要的时间,而不是从缓存或临时文件中检索的时间。
我试图禁止在Java控制面板中生成缓存和临时文件,我试图禁用hibernate缓存(第一级或第二级)。但这些仍然无法解决我的问题。第二次运行时间仍然比应该花费的时间少。
任何想法导致第二次跑得更快的原因?它只是一个从DB
中检索数据的简单应用程序答案 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/
上有一个很好的教程
- 第一级缓存与“会话”对象和其他对象相关联 应用程序中的会话对象无法看到它。
- 缓存对象的范围是会话。会议结束后, 缓存的对象永远消失了。
- 默认启用第一级缓存,无法禁用。
- 当我们第一次查询实体时,会从数据库中检索它 并存储在与hibernate会话关联的第一级缓存中。
- 如果我们再次使用相同的会话对象查询同一个对象,将会是 从缓存加载,不会执行任何SQL查询。
- 可以使用evict()方法从会话中删除加载的实体。 如果下一个加载此实体将再次进行数据库调用 它已被使用evict()方法删除。
- 可以使用clear()方法删除整个会话缓存。它会 删除存储在缓存中的所有实体。
您应该使用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的,但数据库仍然会被隐藏起来。