【发布时间】:2014-11-10 06:33:19
【问题描述】:
我在 Spring 驱动的应用程序中使用 Hibernate (4.2.15.Final) 和 EhCache (2.6.9) 作为二级缓存设置了一个非常标准的持久层。
一切都按预期进行。但是,将条目放入二级缓存有时需要很长时间。
我已在显式 ehcache.xml 文件中配置了域模型类的缓存(我没有配置默认缓存):
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
name="hibernate"
updateCheck="false"
monitoring="autodetect"
dynamicConfig="false"
maxBytesLocalHeap="300M"
maxBytesLocalDisk="500M">
<cache
name="org.mycorp.model.MyEntity"
eternal="true"
overflowToDisk="false"
diskPersistent="false"
maxBytesLocalHeap="5M" />
...
</ehcache>
我在持久性上下文启动时收到以下 INFO 消息:
DefaultSizeOfEngine | using Agent sizeof engine
以及执行期间的以下警告
ObjectGraphWalker | The configured limit of 1,000 object references was reached while attempting to calculate the size of the object graph. Severe performance degradation could occur if the sizing operation continues. [...]
AFAIK ObjectGraphWalker 必须调整放入缓存中的实体的大小,因为我用maxBytesLocalHeap 配置了单个缓存区域。
我的领域模型相当复杂,我知道我可以使用@IgnoreSizeOf 注释来限制图形的行走,但我不确定如何解决这个问题:
- 是否必须忽略双向关联的一侧以避免循环?
- 是否必须明确忽略域模型类的临时成员?
- 一般来说,在将 EhCache 与 Hibernate 一起使用时使用
maxBytesLocalHeap是否明智,或者我应该满足于maxEntriesLocalHeap,因为 Hibernate 无论如何都会为每个实体保留一个单独的缓存区域?
[UPDATE]:我发现,临时成员不会被 Hibernate 缓存(见Hibernate: Is it possible to save a transient field in second level cache?),所以无论如何它们都不应该被 ehcache 处理。正确的?
【问题讨论】:
标签: java hibernate caching jpa ehcache