gpt4 book ai didi

java - 如何停止 Java 或 Hibernate 缓存

转载 作者:行者123 更新时间:2023-11-29 10:11:05 24 4
gpt4 key购买 nike

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

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

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

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

知道第二次跑得更快的原因吗?它只是一个从数据库中检索数据的简单应用程序

最佳答案

Hibernate 一级缓存不能被禁用(参见How to disable hibernate caching)。如果您想强制 Hibernate 查询数据库,您需要了解 Hibernate 的 session 缓存。

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

  1. First level cache is associated with “session” object and other session objects in application can not see it.
  2. The scope of cache objects is of session. Once session is closed, cached objects are gone forever.
  3. First level cache is enabled by default and you can not disable it.
  4. When we query an entity first time, it is retrieved from database and stored in first level cache associated with hibernate session.
  5. If we query same object again with same session object, it will be loaded from cache and no sql query will be executed.
  6. The loaded entity can be removed from session using evict() method. The next loading of this entity will again make a database call if it has been removed using evict() method.
  7. The whole session cache can be removed using clear() method. It will remove all the entities stored in cache.

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

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

关于java - 如何停止 Java 或 Hibernate 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34162560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com