【JavaEE—Hibernate】一级缓存以及事务操作

来源:互联网 发布:java wait time 编辑:程序博客网 时间:2024/05/16 14:10

Hibernate的一级缓存

什么是缓存

数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(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查询,返回对象

这里写图片描述
这里写图片描述
容易看出,第一步执行get方法之后,发送sql语句查询数据库
第二个执行get方法之后,没有发送sql语句,查询一级缓存内容

Hibernate一级缓存执行过程

这里写图片描述

Hibernate一级缓存特性

1 持久态自动更新数据库

这里写图片描述

Hibernate事务操作

事务相关概念

1 什么是事务

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

2 事务特性

  1. 原子性(atomicity)
    一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  2. 一致性(consistency)
    事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  3. 隔离性(isolation)
    一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  4. 持久性(durability)
    持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

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("150");            user.setAddress("中国");            session.save(user);            int i = 10/0;            //提交事务            tx.commit();        }catch(Exception e) {            e.printStackTrace();            //回滚事务            tx.rollback();        }finally {            //关闭操作            session.close();            sessionFactory.close();        }    }

Hibernate绑定session

1 session类似于jdbc的connection,之前web阶段学过 ThreadLocal
2 帮实现与本地线程绑定session

3 获取与本地线程session
(1)在hibernate核心配置文件中配置

这里写图片描述

(2)调用sessionFactory里面的方法得到

这里写图片描述

4 获取与本地线程绑定session时候,关闭session报错,不需要手动关闭了
这里写图片描述

1 3
原创粉丝点击