一尘不染

如何停止Java或Hibernate缓存

hibernate

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

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

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

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

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


阅读 206

收藏
2020-06-20

共1个答案

一尘不染

不能禁用 hibernate一级缓存。如果要 强制 Hibernate查询数据库,则需要了解Hibernate的会话缓存。

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

  1. 一级缓存与“会话”对象关联,应用程序中的其他会话对象看不到它。
  2. 缓存对象的范围是会话。一旦会话关闭,缓存的对象将永远消失。
  3. 默认情况下,第一级缓存处于启用状态, 您不能禁用它
  4. 当我们第一次查询实体时,它是从数据库中检索出来的,并存储在与hibernate会话相关的一级缓存中。
  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) 。

2020-06-20