什么是缓存
数据存储到数据库里面,数据本身是文件系统,使用流方式操作文件的效率不是很高
- 将数据存到内存中,不需要使用流的方式,可以直接读取 内存中的数据
- 把数据放到内存中,提高读取效率
hibernate缓存
- hibernate 框架中提供了很多的优化方式,hibernate 的缓存是一个优化方式
- hibernate缓存的特点:
- ==hibernate一级缓存==
- hibernate的一级缓存状态默认是 打开的
- hibernate的一级缓存状态的使用范围是Session范围,从Session创建到Session关闭范围
- hibernate的一级缓存中,存储数据必须是持久态数据
- hibernate二级缓存
- 二级缓存默认不是打开的,需要配置,二级缓存的应用范围并不多,了解即可
- 二级缓存使用范围,是SessionFactory范围
- 开启方法
- ==hibernate一级缓存==
- 验证一级缓存的存在
- 通过执行两次相同的查询,判断发送了几次sql语句
- 结果:
hibernate一级缓存执行过程
- 查询过程:首先从一级缓存找,如果没有从数据库中找
- 第一次,在一级缓存中查询不到,那么从数据库查询结果,将查询的结果放到一级缓存中
- 第二次再查询,那么就直接从缓存中查询
- 一级缓存中,存放的数据不是实体类对象,而是表格中零散的数据,当查询的时候,将这些零散的数据包装成一个实体类对象返回
hibernate一级缓存特性:持久态自动更新数据库
- 持久态自动更新数据库,对于持久态的实体类对象的修改不需要手动执行update方法
- 第一次查询,将数据库查询的数据放到一级缓存,通过放置一份到副本,
- 当第二次查询的时候,如果进行修改操作,会将修改后的值放在一级缓存
- 当==提交==的时候,判断一级缓存和快照区是否一样,如果不一样,那么提交,数据库更新,
- 实例:一级缓存和一级缓存副本数据不一样,更新数据库
- 结果:
- 如果一样,数据库不更新
- 实例:一级缓存和一级缓存副本的数据相同,不更新数据库
- 结果:
- 当==提交==的时候,判断一级缓存和快照区是否一样,如果不一样,那么提交,数据库更新,
事务代码规范化写法
// 规范化写法
public void test4() {
// 创建SessionFactory对象,使用工具类
SessionFactory factory = null;
Session session = null;
Transaction transaction = null;
try {
factory = HibernateUtils.getSessionFactory();
// 获取 Session对象,类似于连接
session = factory.openSession();
// 开启事务
transaction = session.beginTransaction();
// 执行增删改查
Student student = new Student();
student.setName("王二小");
student.setAge("23");
student.setGender("男");
session.save(student);
// 提交是事务
transaction.commit();
} catch (Exception e) {
// 如果发生异常,那么回滚
transaction.rollback();
// 打印错误日志
e.printStackTrace();
}finally {
// 关闭资源
if(session != null) {
session.close();
}
if(factory != null) {
factory.close();
}
}
}