【Hibernate】05 缓存与MySQL事务隔离
Cache 什么是缓存?
数据存储到数据库,是从内存中以流的方式写进【输出】到数据库,其效率并不是很高
- 所以在内存中暂存一部分数据,可以不以流的方式读取,效率是非常高的【相对于流来说】
Hibernate的缓存特点:
- 一级缓存是默认开启的
- 使用范围在一个Session的作用域中【即:Session存在,缓存存在,Session释放,缓存释放】
- 一级缓存所存储的数据只能是持久状态的的【Java对象】数据
- 二级缓存目前已经技术淘汰,更好的解决方案是使用Redis【其实Mybatis也是差不多】
- 二级缓存需要手动配置,其作用域是整个工程的全局配置 【SessionFactory】
如何验证一级缓存的存在?
@Test
public void query03(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User user = session.get(User.class, 3);
System.out.println(user);
User user2 = session.get(User.class, 3);
System.out.println(user2); System.out.println(user == user2); transaction.commit();
session.close();
sessionFactory.close();
}
测试的结果可以看到,我们的SQL语句只输出了一遍,
但是我们两次返回的结果的对象是一样的,也就是说确实存在缓存,
两次获取的对象的地址才会是一样
一级缓存的执行过程
- 持久态会自动更新数据?
原理:
Hibernate 对 MySQL 的事务隔离配置:
MySQL默认的隔离级别:Repeatable Read 可重复读
我们可以在Hibernate的核心配置中设置事物的隔离级别
它们分别以状态码的形式设置:
- Status 1 读未提交
- Status 2 读已提交
- Status 4 可重复读
- Status 8 序列化
事务代码的规范
@Test
public void transactionSpecs(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction = null; try{
sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction(); // 执行CRUD操作 ... transaction.commit();
} catch (Exception exception){
transaction.rollback(); // 发生异常,回滚事务
exception.printStackTrace(); // 打印异常信息
} finally {
// 资源释放 按先进后出的顺序释放,不要乱顺序释放 // 如果再妥善一点,就再加个非空判断
if (session != null) session.close(); // session是工厂获取的,所以先释放
if (sessionFactory != null )sessionFactory.close(); // 然后释放工厂对象
}
}
Hibernate绑定Session实例
保证在多线程的状态下,Session实例的唯一性
- Session类似JDBC中的Connection
- Web阶段的ThreadLocal
Hibernate已经帮助我们实现了Session实例和本地线程的绑定
如何配置?
1、在hibernate核心配置文件中设置
2、调用会话工厂实例的方法得到
配置:
获取Session实例调用会话工厂的getCurrentSession方法
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
使用本地线程绑定的Session不需要我们释放资源,线程结束自动释放Session
【Hibernate】05 缓存与MySQL事务隔离的更多相关文章
- [51CTO]新说MySQL事务隔离级别!
新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...
- 查询mysql事务隔离级别
查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离 ...
- MySQL事务隔离级别测试实例
https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...
- Mysql事务-隔离级别
MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...
- MySQL事务隔离级别 解决并发问题
MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...
- mysql事务隔离级别、脏读、幻读
Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...
- mysql事务隔离级别与设置
mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...
- MySQL事务隔离级别(二)
搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...
- MySQL事务隔离级别(一)
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- Mysql 事务隔离级别分析
Mysql默认事务隔离级别是:REPEATABLE-READ --查询当前会话事务隔离级别mysql> select @@tx_isolation; +-----------------+ | ...
随机推荐
- 记录工作中常用的 JS 数组相关操作
工作中难免会遇到各种各样的数据结构,较为全面的了解数组操作,对于复杂数据结构的处理会非常有用且节省时间 所以想在这里总结一下工作中常用的数组操作,都是一些非常基础的知识,大家看个乐就好~ 目录 工作中 ...
- .net core (.net6) 读取配置文件 appsettings.json
.net core (.net6) 读取配置文件 appsettings.json 新建个工具类,方便其它地方使用,代码如下 AppHelper: namespace net6mvc.Utils { ...
- scrcpy 安卓投屏
下载地址:https://github.com/Genymobile/scrcpy 电脑是WINDOWS的,下载WINDOWS版scrcpy:scrcpy-win64-v1.14.zip,解压到:D: ...
- Spring AOP 中@Pointcut的用法(多个Pointcut)
Spring AOP 中@Pointcut的用法(多个Pointcut) /** swagger切面,分开来写 **/ @Aspect @Component public class ApiOpera ...
- Mysql int类型字段插入表达式,值为0或1
CREATE TABLE `t_user` ( `uId` INT(11) DEFAULT NULL, `uName` VARCHAR(20) DEFAULT NULL, `uPwd` VARCHAR ...
- Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
目录 在Tez上优化Hive查询的指南 调优指南 理解Tez中的并行化 理解mapper数量 理解reducer数量 并发 案例1:未指定队列名称 案例2:指定队列名称 并发的指南/建议 容器复用和预 ...
- 从0到1:CTFer成长之路网上平台的使用以及docker环境配置
1.首先安装docker(这里在kali里演示) sudo su #以root身份运行 apt install docker.io #安装docker systemctl start docker # ...
- BST-Treap名次树指针实现板子 Ver2.1
为了更好的阅读体验,请点击这里 这里只有板子没有原理QWQ 可实现 1.插入 x 数 2.删除 x 数(若有多个相同的数,只删除一个) 3.查询 x 数的排名(排名定义为比当前数小的数的个数 +1) ...
- 13-flex
01 flex2个重要的概念 02 flex布局模型 03 flex相关属性 04 flex container相关属性 4.1 flex direction 不同的值会改变主轴的方向 4.2 fle ...
- Linux Driver : gpio-keys
Linux Driver : gpio-keys的解析 背景 在阅读高通设备树配置一个按键的时候,没有找到按键是在什么时候进行处理的.因此根据仅有的线索gpio-key.c进行分析,发现根据之前的学习 ...