在我们的应用程序中,我们将hibernate配置为使用ehcache。这样做的目的是,一旦对象被加载到缓存中,除非对象被更改,否则不应该每次调用db调用。
为了测试这个,我调用object并打印 identityhashcode
[使用呼叫] System.identityHashCode(this)
]对象的名称。我注意到 identityhashcode
对象的类型在每次调用中都在变化,这使我们感觉到对象每次都在加载。
但在日志中,我们看不到hibernate对数据库进行任何sql调用。
如果我的测试正确与否,请有人指导一下好吗?
2条答案
按热度按时间dl5txlt91#
有很多事情可以解释这种差异。另外,不命中数据库也可能意味着您正在从会话缓存(又称一级缓存)获取对象。确保在一个会话中创建对象,并在另一个会话中检索它两次(第一次可能会命中数据库,第二次不应该)。
理想情况是询问hibernate是否从缓存中检索到了对象。最简单的方法是启用统计信息收集,然后打印命中/未命中:
vkc1a9a22#
因为您没有看到任何对数据库的调用,所以可以很安全地说缓存正在工作。
您看到不同标识哈希码的原因是ehcache没有按原样存储对象。相反,它存储一个序列化版本,当缓存命中时,它将反序列化该版本。反序列化版本是一个新对象,因此
identityHashCode
.还是比查数据库快。