标签:bsp hibernate 结束 begin ges 文件系统 观察 oid span
该状态下实体类对象的id属性没有值,该对象和session也没有关系。
实例:
UserEntity user = new UserEntity(); user.setName("jack"); user.setPwd("123"); user.setScore(98.5f);
该状态下,实体类的对象的id属性有值,该对象和session也有关系。
实例:
UserEntity userEntity =session.get(UserEntity.class, 1);
该状态下;实体类的对象的id有值,但是和session没有关系。
实例:
UserEntity userEntity = new UserEntity(); userEntity.setUid(1);
数据一般情况下存在数据库中,数据库本身是文件系统,存储在硬盘中,要读取该数据需要使用流,这样访问效率不是很高。
缓存就是把数据保存在内存中,这样就可以直接读取,提高访问速度。
在Hibernate中,有一级缓存和二级缓存。
(1)Hibernate的一级缓存特点:
(2)代码验证一级缓存的存在
原理:多次去查询同一条记录,如果访问了数据库就会在控制台打印出底层的sql语句,通过观察输
出,就可以验证该缓存的存在
代码:
@Test public void Test6(){ SessionFactory sessionFactory = HibernateUtils.getFactory(); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); UserEntity userEntity1 = session.get(UserEntity.class, 2); System.out.println(userEntity1); UserEntity userEntity2 = session.get(UserEntity.class, 2); System.out.println(userEntity2); tx.commit(); session.close(); sessionFactory.close(); }
验证结果:
(3)一级缓存的执行过程
在查询时,首先去一级缓存中查找该数据,如果有直接将数据组装成一个新对象返回,如果没有该数据,则去数据库中查询该数据
查询成功后将该数据保存到一级缓存(不保存对象,而是保存该对象的值),然后在返回本地,对二次查询该数据时,再去一级缓存中
根据id对比数据,该数据已存在,则将该数据组装成一个新对象返回,过程见下图。
(4)一级缓存的特性
特性:持久态会自动更新数据库
验证方式:根据id去查询一个记录,然后修改该记录,修改后不执行update()方法,提交事物。
验证代码:
@Test public void Test7(){ SessionFactory sessionFactory = HibernateUtils.getFactory(); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); UserEntity userEntity1 = session.get(UserEntity.class, 2); userEntity1.setPwd("asddfff"); tx.commit(); session.close(); sessionFactory.close(); }
验证结果:
该特性的原理与过程:
一级缓存在存储数据时会创建一个数据的快照,在提交事务时,会去对比缓存中数据和快照区的数据,如果数据不同,就会去更新数据
库的数据。
(5)Hibernate的二级缓存
标签:bsp hibernate 结束 begin ges 文件系统 观察 oid span
原文地址:http://www.cnblogs.com/jack1995/p/6937573.html