【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; +-----------------+ | ...
随机推荐
- C语言-使用malloc导致的奔溃问题
在使用malloc.memset.free的过程中,出现了程序奔溃,大致现象如下. 程序的实现大致如下: #include <stdio.h> #include <stdlib.h& ...
- 搭建高可用k8s
搭建k8s高可用 高可用只针对于api-server,需要用到nginx + keepalived,nginx提供4层负载,keepalived提供vip(虚拟IP) 系统采用openEuler 22 ...
- 鼠标悬浮显示鼠标停留数据的内容 elementui + vue
先看效果图 直接上代码 <el-tabs v-model="activeName" @tab-click="handleClick"> <el ...
- FRDM-MCXN947开发板之i2c应用
介绍 MCXN947 NXP FRDM-MCXN947开发板是一款基于MCXN947 MCU的低成本评估板,MCU集成了双核Arm Cortex-M33微控制器和一个神经处理单元(NPU).开发板由一 ...
- k8s配置文件管理
1.为什么要用configMap ConfigMap是一种用于存储应用所需配置信息的资源类型,用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件. 通过ConfigMap可以方便的 ...
- 338 warnings potentially fixable with the `--fix` option.
将lint的值设置为eslint --fix --ext .js,.vue src,重启就可以了或者直接把lint这行删除掉
- 【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念
目录 前言 一.初识 RocketMQ 1.1基本模型 二.基本概念 2.1Producer 2.2Consumer 2.3Topic 2.4Tag 2.5Message 2.6Broker 2.7P ...
- 记录一下第一次webSocket通信成功
webSocket前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Oracle自动化编译无效对象
问题描述:使用存储过程的方式对oracle数据库的无效对象,如视图或者同义词进行定期的编译,让他变成一个有效的对象,加上定时任务可以实现自动化的处理.同时在数据库内部创建一个记录表,用来记录被编译过的 ...
- k8s实战 ---- pod 基础
如果你对k8s还不了解,可以看下前文 k8s 实战 1 ---- 初识 (https://www.cnblogs.com/jilodream/p/18245222) 什么是pod,pod在 ...