hibernate--一级缓存和快照机制
缓存定义:
内存中的临时数据,减少和数据库交互的次数,从而提高查询效率。
使用缓存的数据:经常查询的,不经常修改。同时数据一旦出现问题,对最终结果影响不大。
不适用缓存的数据:需要经常修改。并且由于使用缓存,对数据影响很大。(银行的汇率,库存的数据)
一级缓存:
指Session对象的缓存,相同查询的条件,会在缓冲区调用,而不是再次访问数据库,一旦对象销毁了,缓存就会清除。
Session对象按键值对的存储类型,key是全限定类名的字符串“com.bean.Customer.class ”,value是一个Map(key存的是OID,value存的是数据库对象)
session.clear(),在关闭之前调用,可以清除缓存
代码测试
@Test public void cacheTest(){ Session s= HibernateUtils.getSession(); Transaction tx = s.beginTransaction(); //一级缓存存入session对象,默认开启,当执行同样的查询时,只访问一次数据库 Object c1 = s.get(Customer.class, 1); System.out.println(c1); Object c2 = s.get(Customer.class, 1); System.out.println(c2); tx.commit(); s.close(); //session关闭,缓存也会清除 }
测试结果
Hibernate: select customer0_.id as id0_0_, customer0_.name as name0_0_, customer0_.lovel as lovel0_0_ from customer customer0_ where customer0_.id=? Customer [id=1, name=张飞, lovel=做县官] Customer [id=1, name=张飞, lovel=做县官]
说明同样的查询条件,只访问了一次数据库。
快照机制:
@Test
public void kuaizhaoTest(){
Session s= HibernateUtils.getSession();
Transaction tx = s.beginTransaction();
//查询id为6的Customer
Customer c1 = (Customer)s.get(Customer.class, 6);
System.out.println(c1.getLovel());
//给id为6的Customer重设值
c1.setLovel("一生正气");
System.out.println(c1.getLovel());
//此事没有写update语句
Customer c2 = (Customer)s.get(Customer.class, 6);
System.out.println(c2);
tx.commit(); //快照区,会根据OID去数据库查数据,发现不一样的数据会,马上更新
s.close(); //session关闭,缓存也会清除
System.out.println(c1.getLovel());
}
输出结果
Hibernate: select customer0_.id as id0_0_, customer0_.name as name0_0_, customer0_.lovel as lovel0_0_ from customer customer0_ where customer0_.id=?
不爱人妻
一生正气
Customer [id=6, name=曹孟德, lovel=一生正气]
Hibernate: update customer set name=?, lovel=? where id=?
一生正气
得出:快照区,会根据OID去数据库查数据,发现不一样的数据会,会马上更新数据库;快照区在Session中,且程序员不能修改。
habernate中对象的状态:
1.临时状态:没有OID,和没有关系。new Bean()。
2.持久化状态:有OID,和Session没有关系。save/update
3.托管状态:有OID,和Session没有关系。session.close()。
4.删除状态:没有OID,和Session有关系。此时已经执行删除。

@Test public void saveTest(){ Customer customer = new Customer("刘备","十八玄孙"); //零时状态 //1.使用工具获取Session Session s= HibernateUtils.getSession(); Transaction tx = s.beginTransaction(); s.save(customer); //执行保存,持久状态 //不会执行查询 Customer customer2=(Customer) s.get(Customer.class,customer.getId()); System.out.println("测试:"+customer2); tx.commit(); s.close(); //session关闭后,customer就会处于一个托管的状态,脱离session管理 customer.setLovel("匡扶汉室"); System.out.println(customer.getLovel()); Session s1= HibernateUtils.getSession(); s1.update(customer); //执行保存再次转为持久化状态 s1.close(); System.out.println(customer); //再次托管 }

浙公网安备 33010602011771号