Hibernate的一级缓存
什么是缓存
1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
(2)把数据放到内存中,提供读取效率
Hibernate缓存
1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
2 hibernate缓存特点
第一类 hibernate的一级缓存
(1)hibernate的一级缓存默认就是打开的
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须 持久态数据
第二类 hibernate的二级缓存
(1)目前不使用了,替代技术 redis
(2)二级缓存默认不是打开的,需要进行配置
(3)二级缓存使用范围,是sessionFactory范围
验证一级缓存存在
1 验证方式
(1)首先根据uid=1查询,返回对象
(2)其次再根据uid=1查询,返回对象
@Test public void testCache() { SessionFactory sessionFactory=HibernateUtils.getSessionFactory(); Session session=sessionFactory.openSession(); Transaction tx=session.beginTransaction(); //1根据uid=5进行查询 //执行第一个get方法是否查询数据库,是否发送sql语句 User user=session.get(User.class, 5); System.out.println(user); //2根据uid=5进行查询 //执行;第二个get方法是否查询数据库,是否发送sql语句 User user2=session.get(User.class, 5); System.out.println(user2); tx.commit(); session.close(); sessionFactory.close(); }
第一步执行get方法之后,发送sql语句,查询一级缓存内容
第二个执行get方法之后,没有发送sql语句,查询一级缓存内容
运行结果如下所示:
一级缓存执行过程
Hibernate一级缓存特性
1 持久态自动更新数据库
public class HibernateSelect { @Test public void testDemo() { SessionFactory sessionFactory=HibernateUtils.getSessionFactory(); Session session=sessionFactory.openSession(); Transaction tx=session.beginTransaction(); //1根据uid=5进行查询 //执行第一个get方法是否查询数据库,是否发送sql语句 User user=session.get(User.class, 5); System.out.println(user); //2设置返回值 user.setUsername("韩梅梅"); //3 调用方法实现 //session.update(user); tx.commit(); session.close(); sessionFactory.close(); } }
2 执行过程(了解)
HIbernate事务操作
事务相关概念
1 什么是事务
事务是操作中的基本单元,事务中的操作,要么都成功,要么都失败。比如:银行转账
2 事务特性
acid,原子性,一致性,隔离性,持久性。
3 如果不考虑隔离性
(1)脏读,
(2)不可重复读
(3)虚读
4 设置事务隔离级别
(1)mysql默认隔离级别repeatable_read
Hibernate 事务规范代码写法
1 代码结构
try{ 开启事务, 提交事务 }catch(){ 回滚事务 }finally{ 关闭 }
//事务规范代码 @Test public void testTx() { SessionFactory sessionFactory=null; Session session=null; Transaction tx=null; try { sessionFactory=HibernateUtils.getSessionFactory(); session=sessionFactory.openSession(); tx=session.beginTransaction(); User user=new User(); user.setUsername("马云"); user.setPassword("778"); user.setAddress("杭州"); session.save(user); int i=10/0; //提交事务 tx.commit(); } catch(Exception e){ tx.rollback(); }finally { session.close(); sessionFactory.close(); } }