我有一个应用程序可以从数据库中检索数据,并且可以监视应用程序检索数据所花费的时间。
但是,当我使用相同的数据输入集通过我的应用程序检索数据时,我遇到了一个问题,第二次检索将花费更少的时间。
我认为Java或Hibernate有一些缓存或临时文件来保存数据,因此第二次运行会很快,但是我不希望发生这种情况。我需要监视实际花费的时间,而不是从缓存或临时文件检索的时间。
我试图禁止在Java控制面板中生成缓存和临时文件,我试图禁用hibernate缓存(第一级或第二级)。但是这些仍然不能解决我的问题。第二次运行仍然比需要的时间少。
知道导致第二次运行更快的原因吗?它只是一个简单的应用程序,可从数据库检索数据
不能禁用 hibernate一级缓存。如果要 强制 Hibernate查询数据库,则需要了解Hibernate的会话缓存。
Lokesh Gupta在http://howtodoinjava.com/2013/07/01/understanding-hibernate- first-level-cache-with- example/上有很好的教程
一级缓存与“会话”对象关联,应用程序中的其他会话对象看不到它。 缓存对象的范围是会话。一旦会话关闭,缓存的对象将永远消失。 默认情况下,第一级缓存处于启用状态, 您不能禁用它 。 当我们第一次查询实体时,它是从数据库中检索出来的,并存储在与hibernate会话相关的一级缓存中。 如果我们使用相同的会话 对象再次查询相同的对象 , 则会从缓存中加载该 对象, 并且不会执行任何SQL查询。 可以使用evict()方法从会话中删除已加载的实体。 如果已使用evict()方法删除了该实体,则该实体的下一次加载将再次进行数据库调用。 可以使用clear()方法删除整个会话缓存。它将删除所有存储在缓存中的实体。
因此,您应该使用evict()或clear()方法来强制查询数据库。
evict()
clear()
为了验证这一点,您可以使用hibernate.show_sql配置属性打开SQL输出(请参阅https://docs.jboss.org/hibernate/orm/5.0/manual/en- US/html/ch03.html#configuration- optional) 。
hibernate.show_sql