四、缓存的管理
Hibernate 的缓存管理
一级缓存的管理 :
evit(Object obj) 将指定的持久化对象从一级缓存中清除 , 释放对象所占用的内存资源 , 指定对象从持久化状态变为脱管状态 , 从而成为游离对象 .
clear() 将一级缓存中的所有持久化对象清除 , 释放其占用的内存资源
contains(Object obj) 判断指定的对象是否存在于一级缓存中 .
flush() 刷新一级缓存区的内容 , 使之与数据库数据保持同步 .
二级缓存的管理 :
evict(Class arg0, Serializable arg1) 将某个类的指定 ID 的持久化对象从二级缓存中清除 , 释放对象所占用的资源 .
evictCollection(String arg0) 将指定类的所有持久化对象的指定集合从二级缓存中清除 , 释放其占用的内存资源 .
如何避免一次性大量的实体数据入库导致内存溢出
* 先 flush ,再 clear
如果数据量特别大,考虑采用 jdbc 实现,如果 jdbc 也不能满足要求,可以考虑采用数据库本身的特定导入工具
五、什么样的数据不适合放在二级缓存中来 ?
下面这几种情况就不适合 加载到二级缓存中 :
1. 经常被修改的数据
2. 绝对不允许出现并发访问的数据
3. 与其他应用共享的数据
下面这己种情况合适 加载到二级缓存中 :
1. 数据更新频率低
2. 允许偶尔出现并发问题的非重要数据
3. 不会被并发访问的数据
4. 常量数据
5. 不会被第三方修改的数据
六、二级缓存的配置
Hibernate 的二级缓存功能是靠配置二级缓存插件来实现的 ,Hibernate 为了集成这些插件 ,Hibernate 提供了 org.hibernate.cache.CacheProvider 借口 , 它充当缓存插件与 Hibernate 之间的适配器 .
常用的二级缓存插件
EHCache org.hibernate.cache.EhCacheProvider
OSCache org.hibernate.cache.OSCacheProvider
SwarmCahe org.hibernate.cache.SwarmCacheProvider
JBossCache org.hibernate.cache.TreeCacheProvider
设置 hibernate.cache.provider_class 。
我们这里用 ehcache ,如
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
由于这是 HIBERNATE 默认的 CACHE 提供者 , 所以无须做什么设置 .
只要在 src 中添加 ehcache 的配置文件 ehcache.xml:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
<cache name="goncha.hb.bean.Person" maxElementsInMemory="10" eternal="false"
timeToIdleSeconds="100" timeToLiveSeconds="100" overflowToDisk="false" />
<cache name="goncha.hb.bean.Address" maxElementsInMemory="10" eternal="false"
timeToIdleSeconds="100" timeToLiveSeconds="100" overflowToDisk="false" />
</ehcache>