级Cache:
Session实现了第级Hibernate Cache它属于事务级数据缓冲旦事务结束这个Cache也随的失效个Session生命周期对应个数据库事务或个事务
Session-cache保证了个Session中两次请求同个对象时取得对象是同个JAVA例子有时它可以避免不必要数据冲突另外它还能为另些重要性能提供保证:
1:在对个对象进行自我循环引用时 不至于产生堆栈溢出
2:当数据库事务结束时对于同个数据库行不会产生数据冲突对于数据库中行最多只有个对象来表示它
3:个事务中可能会有很多个处理单元在每个处理单元中做操作都会立即被另外处理单元得知
我们不用刻意去打开Session-cache它总是被打开并且不能被关闭当使用save()update()或saveOrUpdate()来保存数据更改或通过load()find()list()等思路方法来得到对象时对象就会被加入到Session-cache.
如果要同步很多数据对象就需要有效地管理Cache可以用Sessionevict()思路方法从级Cache中移除对象如下:
Session session = HibernateUtil.currentSession;
Transaction tx = session.beginTransaction;
for( i = 0 ; i <100000 ; i)
{
Student stu = Student;
session.save(stu);
}
tx.commit;
session.close();在保存50000个或更多对象时可能会抛出OutOfMemoryException异常Hibernate Cache在级缓存Cache了新加入所有对象内存溢出要解决这全问题就需要把JDBC批处理数量设置为个合理数值(般是10~20)在Hibernate Cache配置文件中可以加入以下属性
<property name="hibernate.jdbc.batch_size"> 20 </property>
然后我们在中定时刻就提交并更新SessionHibernate Cache:
Session session = HibernateUtil.currentSession;
Transaction tx = session.beginTransaction;
for( i = 0 ; i <100000 ; i)
{
Student stu = Student;
session.save(stu);
(i%20 0) //每保存完20个对象后进行如下操作
{
session.flush;//这个会提交更新
session.clear;//清除Cache,释放内存
}
}
2级Cache
2级Cache是SessionFactory范围内缓存Cache所有Session共享同个 2级Cache.在 2级Cache中保存持久性例子散装形式数据 2级Cache内部如何实现并不重要重要是采用哪种正确缓存Cache策略以及采用哪个Cache提供器持久化区别数据需要区别Cache策略比如些原因将影响到Cache策略选择:数据读/写比例数据表是否能被其他应用扬访问等对于些读/写比例高数据可以打开它缓存Cache允许这些数据进入 2级缓存Cache容器有利于系统性能优化;而对于能被其它应用访问数据对象最好将此对象 2级Cache选项关闭
设置Hibernate Cache 2级需要分两步进行:首先确认使用什么数据并发策略然后配置缓存Cache过期时间并设置Hibernate Cache提供器
有4种内置Hibernate数据并发冲突策略代表数据库隔离级别如下:
1:事务(Transaction)仅在受管理环境中可用它保证可重读事务隔离级别可以对读/写比例高很少更新数据采用该策略
2:读写(read-write)使用时间戳机制维护读写提交事务隔离级别可以对读/写比例高很少更新数据采用该策略
3:非严格读写(notstrict-read-write)不保证Cache和数据库的间数据库致性使用此策略时应该设置足够缓存Cache过期时间否则可能从缓存Cache中读出脏数据当些数据极少改变并且当这些数据和数据库有部份不量影响不大时可以使用此策略
4:只读(read-only)当确保数据永不改变时可以使用此策略
我们确定了Hibernate Cache策略后就要挑选个高效Cache提供器它将作为插件被HibernateHibernate允许使用下述几种缓存Cache插件:EhCache:可以在JVM中作为个简单进程范围内缓存Cache它可以把缓存Cache数据放入内存或磁盘并支持Hibernate中可选用查询缓存Cache
OpenSymphony OSCache:和EhCache相似并且提供了丰富缓存Cache过期策略
◆SwarmCache:可作为集群范围缓存Cache但不支持查询缓存Cache
◆JBossCache:可作为集群范围缓冲但不支持查询缓存Cache
在Hibernate中使用EhCache
EhCache是个纯JAVA可以在Hibernate中作为个插件引入在Hibernate中使用EhCache需要在Hibernate配置文件中设置如下:
<propery name="hibernate.cache.provider_">
org.hibernate.cache.EhCacheProvider
</property>
<ehcache>
<diskStore path="c:\\cache"/> //设置cache.data文件存放位置
<defaultCache
maxElementsInMemory="10000" //缓存Cache中允许创建最大对象数
eternal="false" //缓存Cache中对象是否为永久
timeToIdleSeconds="120"//缓存Cache数据钝化时间(即对象在它过期前空闲时间)
timeToLiveSeconds="120"//缓存Cache数据生存时间(即对象在它过期前生存时间)
overflowToDisk="true"
/>
<cache name="Student" //用户自定义Cache配置
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
</ehcache>
此外我们还需要在持久化类映射文件中进行配置例如Group(班级)和Student(学生)是对多关系它们对应数据表分别是t_group和t_student.现在要把Student类数据进行 2级缓存Cache这需要在 2个映射文件中都对 2级缓存Cache进行配置
在Group.hbm.xml中如下在其<></>中添加
<cache usage="read-write"/><!——集合中数据被缓存Cache——>上述文件虽然在<>标记中设置了<cache usage="read-write"/>但Hibernate只是把Group相关Student主键ID加入到缓存Cache中如果希望把整个Student散装属性都加入到 2级缓存Cache中还需要在Student.hbm.xml文件<>标记中添加<cache>子标记如下:
< name="Student" table="t_student">
<cache usage="read-write" /><!--cache标记需跟在标记后-->
</>
最新评论