未缓存hibernate对象

agxfikkp  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(345)

在我们的应用程序中,我们将hibernate配置为使用ehcache。这样做的目的是,一旦对象被加载到缓存中,除非对象被更改,否则不应该每次调用db调用。
为了测试这个,我调用object并打印 identityhashcode [使用呼叫] System.identityHashCode(this) ]对象的名称。我注意到 identityhashcode 对象的类型在每次调用中都在变化,这使我们感觉到对象每次都在加载。
但在日志中,我们看不到hibernate对数据库进行任何sql调用。
如果我的测试正确与否,请有人指导一下好吗?

dl5txlt9

dl5txlt91#

有很多事情可以解释这种差异。另外,不命中数据库也可能意味着您正在从会话缓存(又称一级缓存)获取对象。确保在一个会话中创建对象,并在另一个会话中检索它两次(第一次可能会命中数据库,第二次不应该)。
理想情况是询问hibernate是否从缓存中检索到了对象。最简单的方法是启用统计信息收集,然后打印命中/未命中:

Statistics stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
... // do your work
long hitCount = stats.getQueryCacheHitCount();
long missCount = stats.getQueryCacheMissCount();
vkc1a9a2

vkc1a9a22#

因为您没有看到任何对数据库的调用,所以可以很安全地说缓存正在工作。
您看到不同标识哈希码的原因是ehcache没有按原样存储对象。相反,它存储一个序列化版本,当缓存命中时,它将反序列化该版本。反序列化版本是一个新对象,因此 identityHashCode .
还是比查数据库快。

相关问题