本文共 2009 字,大约阅读时间需要 6 分钟。
4、Hibernate缓存
Session缓存(一级缓存,没法禁用的,属于事务级缓存)的作用:
减少访问数据库的频率;保证缓存中的对象与数据库中的相关记录保持同步(当缓存中持久化对象的状态发生了变化,session并不会立即执行相关的sql语句,这使得session能够把几条相关的sql合并成一条进行执行,减少访问数据库的频率,提供程序性能。)
Session清理缓存的时间点:
Transaction tx = session.beginTransaction();
tx.commit();
1):调用了commit()方法会先清空session缓存,然后去提交事务;
2):session.flush();强制性的情况缓存。
SessionFactory缓存(二级缓存,可配置,属于进程级缓存)。可由第三方实现提供.
如:EhCache使用了一个内存存储和磁盘存储。对应的jar:ehcache-1.2.3.jar
要使用二级缓存,首先需要先开启二级缓存(在hibernate.cfg.xml)中进行配置
true org.hibernate.cache.EhCacheProvider
在关联关系map set list中,如果想保存多的那一方数据,
需要在该元素下配置<cache name = "?"/>,只是设置cache只会保存OID,而不是整个数据对象。 而且还需要在多的一方配置<cache name = "?"/> 其中?存在四个值: read-only: read-write:使用了<timestamp>机制来维护事务隔离级别 nonstrict-read-write:二级缓存与数据库中的信息可能会出现不一致的情况 在使用这种策略时,可以使用缓存过期时间来定期与数据库进行缓存数据与 数据库数据进行同步。 transactional:
还需要配置一个二级缓存自身的文件
ehcache.xml文件(该文件在src目录下)该文件的内容为:同时需要添加两个jar包支持
asm-3.1.jar ; commons-logging-1.1.1.jar
Hibernate一级缓存(session缓存) ------------>Hibernate二级缓存(sessionFactory缓存,为可配置缓存
public class Student implements Serializabe{ pivate Long id; private String name; prvate String pass; ...setter/getter...}
查询所有的列表时,进行第二次查询也会发出sql,查询单独的会从缓存中获取。
//读取数据Session session = sessionFactory.openSession();Query query = session.createQuery("from Student");//此处调用直接从数据库中获取Listlist = (List )query.list();//再次查询数据,直接从二级缓存中获取数据,不在查询数据库Session s = sessionFacory.openSession();Student ss = (Student)s.get(Student.class,new Long(1));
5、Hibernate 对象的状态
1):临时状态(transient):刚被new出来的对象,还没有被持久化,不处于session的缓存中,不具备OID
2): 持久化状态:已经被持久化,加入到了session缓存中,具备OID.
3):游离状态:已经被持久化,但是不再处于session缓存中,具备OID.
Hibernate对象状态的变化条件:
new -------> 临时状态 -------save();saveOrUpdate();----> 持久化状态 -----close();clear();evict();--->游离状态 ----save();saveOrUpdate();lock();--->持久化状态 ---delete();--->临时状态
持久化状态 ---delete();----> 临时状态
Hibernate使用连接池直接配置接口(略..)
转载地址:http://ahxei.baihongyu.com/