我正在使用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>
使用这个,我试图期待两件事
如果DB中有任何更新,同一对象应在15到20分钟内在EhCache中刷新。我知道如果我使用eternal="true"
会忽略timeToLiveSeconds="1200"
。如何在EhCache中重新加载更新的对象?
EhCache应使用提供给App服务器的最大内存。有没有办法为EhCache分配内存?
建议您是否有任何其他选项与EhCache一起提高性能并减少数据库调用。
答案 0 :(得分:0)
关于到期日,我建议仅将timeToLiveSeconds
设置为适合您的值。如果您可以提供15至20分钟的陈旧数据,那么这是最有效的工作方式。不要设置eternal
,表示不会发生过期 - 永远。也不要使用提供奇怪合同的timeToIdleSeconds
:如果访问,则认为值是新的。如果您无法提供过时的数据服务,则只要业务逻辑更新数据库条目,就需要进行直接的无效调用,例如Ehcache.remove(key)
。
Ehcache允许您以字节为单位调整堆层大小,但这会产生运行时成本。使用该功能的一种方法是进行测试,确定消耗的内存/条目计数比率,然后在生产中使用条目计数。
请注意,对于第2点,您可以查看Ehcache 3.x,它提供了一个offheap层,不仅可以使用大量内存,而且还不会影响垃圾回收。
答案 1 :(得分:0)
您的用例没问题。