休眠对象没有被缓存
Hibernate object not getting cached
在我们的应用程序中,我们配置了 Hibernate 以使用 EHcache。目的是一旦对象被加载到缓存中,除非对象被更改,否则不应调用任何数据库调用。
为了对此进行测试,我正在调用对象并打印对象的 identityhashcode
[使用调用 System.identityHashCode(this)
]。我注意到对象的 identityhashcode
在每次调用中都在变化,这让我们觉得对象每次都在加载。
但是在日志中,我们没有看到 Hibernate 对数据库进行任何 sql 调用。
有人可以指导一下,我的测试是否正确?
由于您没有看到对数据库的任何调用,可以肯定地说缓存正在工作。
您看到不同身份哈希码的原因是因为 EHCache 不按原样存储对象。相反,它存储一个序列化版本,当缓存命中时它将反序列化。反序列化版本是一个新对象,因此 identityHashCode
.
还是比去数据库快。
有很多事情可以解释这种差异。此外,不访问数据库也可能意味着您正在从会话缓存(也称为一级缓存)中获取对象。确保在一个会话中创建对象并在另一个会话中检索它两次(第一次可能访问数据库,第二次不应该)。
理想情况是询问 Hibernate 对象是否从缓存中检索到。最简单的方法是启用统计信息收集,然后打印 hits/misses:
Statistics stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
... // do your work
long hitCount = stats.getQueryCacheHitCount();
long missCount = stats.getQueryCacheMissCount();
在我们的应用程序中,我们配置了 Hibernate 以使用 EHcache。目的是一旦对象被加载到缓存中,除非对象被更改,否则不应调用任何数据库调用。
为了对此进行测试,我正在调用对象并打印对象的 identityhashcode
[使用调用 System.identityHashCode(this)
]。我注意到对象的 identityhashcode
在每次调用中都在变化,这让我们觉得对象每次都在加载。
但是在日志中,我们没有看到 Hibernate 对数据库进行任何 sql 调用。
有人可以指导一下,我的测试是否正确?
由于您没有看到对数据库的任何调用,可以肯定地说缓存正在工作。
您看到不同身份哈希码的原因是因为 EHCache 不按原样存储对象。相反,它存储一个序列化版本,当缓存命中时它将反序列化。反序列化版本是一个新对象,因此 identityHashCode
.
还是比去数据库快。
有很多事情可以解释这种差异。此外,不访问数据库也可能意味着您正在从会话缓存(也称为一级缓存)中获取对象。确保在一个会话中创建对象并在另一个会话中检索它两次(第一次可能访问数据库,第二次不应该)。
理想情况是询问 Hibernate 对象是否从缓存中检索到。最简单的方法是启用统计信息收集,然后打印 hits/misses:
Statistics stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
... // do your work
long hitCount = stats.getQueryCacheHitCount();
long missCount = stats.getQueryCacheMissCount();