我有一个使用Hibernate持久性库的Java应用程序,大约有100个映射类。为了尝试二级缓存,我将@Cacheable添加到了5个映射类中。这导致标准计算任务花费的时间是之前的两倍,尽管缓存项目上有几次点击(如Couchbase缓存监控控制台所示)。由于Couchbase统计数据的瞬态特性,我无法得到确切的平均命中率,但我估计它只有10-20%左右。
某些实体的启用缓存是否会影响未标记为@Cacheable的其他实体的访问时间,从而导致性能下降? 或者仅仅是由于缓存查询的延迟增加以及缓存项目的命中率低而造成的?
我正在使用Hibernate 3.3。我已禁用查询缓存。我用Memcached&获得了类似的结果。 GemFire作为缓存提供者。
答案 0 :(得分:1)
嗯,我想这取决于缓存提供程序做什么来查看条目是否被缓存。如果这是一项昂贵的操作,如果缓存命中率很低,从数据库中检索数据将会很昂贵。通常,缓存提供商应努力使其尽可能便宜。例如,在Infinispan的情况下,这是一个简单的内存检查,以查看实体是否被缓存,如果没有,则通过Hibernate从数据库中检索该条目,并且Infinispan缓存提供程序将其放入缓存中一个非常有效的put操作,叫做putForExternalRead。
你应该真的给Infinispan缓存提供商。 https://docs.jboss.org/author/x/FgY5中的更多信息。如果您在JBoss AS7中运行,请改为阅读https://docs.jboss.org/author/x/LoJ7。
免责声明:我是Infinispan的开发者。