Hibernate5.x缓存机制和事务处理
一、Hibernate一级缓存
1、什么是缓存
数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
(2)把数据放到内存中,提供读取效率
2、Hibernate一级缓存特点
(1)hibernate的一级缓存默认打开的
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须持久态数据
3、Hibernate一级缓存特性和作用
特性:持久态自动更新数据库
作用:减少对数据库的访问次数
4、验证一级缓存
1 验证方式
(1)首先根据uid=1查询,返回对象
(2)其次再根据uid=1查询,返回对象
第一步执行get方法之后,发送sql语句查询数据库
第二个执行get方法之后,没有发送sql语句,查询一级缓存内容
5、一级缓存执行过程
二、Hibernate二级缓存
(1)目前已经不使用了,替代技术 Redis
(2)二级缓存默认不是打开的,需要配置
(3)二级缓存使用范围,是sessionFactory范围
三、Hibernate事务处理
1、事务的4个特性:原子性、一致性、隔离性、持久性
① 原子性:对事务的增删改查操作,要么全部执行,要么全部不执行。
② 一致性:事务完成时,必须使所有的数据都保持一致状态。
③ 隔离性:一个事务的执行不能被其他事务干扰。
④ 持久性:一个事务一旦提交,数据库中的数据改变是永久的。
2、事务的并发问题:脏读、不可重复读、虚读/幻读(insert)
① 脏读:一个事务读取到另一个事务未提交的数据。
② 不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在同一个事务中的多次查询结果不一致。
3、事务的隔离级别
MySQL:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ(默认)、SERIALIZABLE
ORACLE:READ_COMMITTED(默认)、REPEATABLE_READ、SERIALIZABLE
4、事务代码规范
@Test public void testTx() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = DUtils.getSessionFactory(); session = sessionFactory.openSession(); //开启事务 tx = session.beginTransaction(); //增删改查方法编写的位置 //添加 User user = new User(); user.setUsername("王五"); user.setPassword("1234"); user.setAddress("中国"); session.save(user); //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); //回滚事务 tx.rollback(); } finally { session.close(); sessionFactory.close(); } }