一、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();
}
}