Hibernate对象未被缓存

时间:2015-04-28 08:44:09

标签: java hibernate ehcache

在我们的应用程序中,我们已将Hibernate配置为与EHcache配合使用。目标是一旦在Cache中加载了对象,除非对象被更改,否则不应调用每个db调用。

为了测试这一点,我正在调用对象并打印identityhashcode [使用调用System.identityHashCode(this)]对象。而且我注意到identityhashcode的对象在每次调用中都在变化,这使我们感觉到对象每次都在加载。

但是在日志中,我们没有看到Hibernate对数据库进行任何sql调用。

如果我的测试是否正确,有人可以指导吗?

2 个答案:

答案 0 :(得分:3)

由于您没有看到对数据库的任何调用,因此可以非常安全地说缓存正在运行。

您看到不同身份哈希码的原因是因为EHCache不会按原样存储对象。相反,它存储了一个序列化版本,当缓存命中时它将反序列化。反序列化版本是一个新对象,因此不同identityHashCode

它仍然比进入数据库更快。

答案 1 :(得分:3)

有很多东西可以解释这种差异。此外,不访问数据库也可能意味着您从会话缓存(也称为第一级缓存)获取对象。确保在一个会话中创建对象并在另一个会话中检索它两次(第一个可能会命中数据库,第二个不应该)。

理想的做法是询问Hibernate是否从缓存中检索了对象。最简单的方法是启用统计信息收集,然后打印命中/未命中:

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