通过增加EhCache的APP服务器内存来提高性能

时间:2017-07-21 08:03:55

标签: java hibernate ehcache second-level-cache

我正在使用Hibernate与EhCache进行二级缓存。几乎90%的电话都是只读的。 因此,为了提高性能,计划增加APP服务器内存(大约16GB)并期望EhCache将加载最大数据并减少我的数据库调用。

为此我做了以下配置

<defaultCache
    maxElementsInMemory="10000000"
    eternal="true"
    timeToIdleSeconds="1200"
    timeToLiveSeconds="1200"
    overflowToDisk="false"
    memoryStoreEvictionPolicy="LRU">

</defaultCache>

<cache name="org.hibernate.cache.StandardQueryCache"
        maxElementsInMemory="500"
        eternal="true"
        overflowToDisk="false">
</cache>

<cache name="org.hibernate.cache.UpdateTimestampsCache"
        maxElementsInMemory="500"
        eternal="true"
        overflowToDisk="false"
        memoryStoreEvictionPolicy = "LFU">
</cache>

使用这个,我试图期待两件事

  1. 如果DB中有任何更新,同一对象应在15到20分钟内在EhCache中刷新。我知道如果我使用eternal="true"会忽略timeToLiveSeconds="1200"。如何在EhCache中重新加载更新的对象?

  2. EhCache应使用提供给App服务器的最大内存。有没有办法为EhCache分配内存?

  3. 建议您是否有任何其他选项与EhCache一起提高性能并减少数据库调用。

2 个答案:

答案 0 :(得分:0)

  1. 关于到期日,我建议仅将timeToLiveSeconds设置为适合您的值。如果您可以提供15至20分钟的陈旧数据,那么这是最有效的工作方式。不要设置eternal,表示不会发生过期 - 永远。也不要使用提供奇怪合同的timeToIdleSeconds:如果访问,则认为值是新的。如果您无法提供过时的数据服务,则只要业务逻辑更新数据库条目,就需要进行直接的无效调用,例如Ehcache.remove(key)

  2. Ehcache允许您以字节为单位调整堆层大小,但这会产生运行时成本。使用该功能的一种方法是进行测试,确定消耗的内存/条目计数比率,然后在生产中使用条目计数。

  3. 请注意,对于第2点,您可以查看Ehcache 3.x,它提供了一个offheap层,不仅可以使用大量内存,而且还不会影响垃圾回收。

答案 1 :(得分:0)

您的用例没问题。

  1. 如果您的数据库更新也是使用hibernate完成的,Hibernate应该从缓存中逐出条目。
  2. 将在下次尝试时重新缓存它们
  3. 按照@ louis-jacomet所说