繁体   English   中英

如何停止Java或Hibernate缓存

[英]How can I stop Java or Hibernate Caching

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

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

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

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

知道导致第二次运行更快的原因吗? 它只是一个简单的应用程序,可从数据库检索数据

不能禁用休眠一级缓存(请参阅如何禁用休眠缓存 )。 如果要强制 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 )。

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

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

MySQL-强制不使用缓存来测试查询速度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM