【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; +-----------------+ | ...
随机推荐
- Linux进程间通信-FIFO(命名管道)
本系列文章主要是学习记录Linux下进程间通信的方式. 常用的进程间通信方式:管道.FIFO.消息队列.信号量以及共享存储. 参考文档:<UNIX环境高级编程(第三版)> 参考视频:Lin ...
- 喜讯!INFINI Easysearch 在墨天轮搜索型数据库排名中荣登榜首
近日,2023 年 9 月的 墨天轮中国数据库流行度排行 火热出炉,本月共有 287 个数据库参与排名,中国数据库行业竞争日益激烈.其中,极限科技旗下软件产品 INFINI Easysearch 在 ...
- 基于 Easysearch kNN 搭建即时图片搜索服务
环境准备 启动 Easysearch 服务: # Make sure your vm.max_map_count meets the requirement sudo sysctl -w vm.max ...
- MySQL数据库开发(1)
数据库的概述 1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式, 它们都可以经过数字化后存入计算机. 在计 ...
- nginx rewrite实践
nginx rewrite跳转(高级) 官网 https://nginx.org/en/docs/http/ngx_http_rewrite_module.html 该ngx_http_rewrite ...
- Vue学习:17.组件通信案例-记事本
通过上一节的学习,我们了解并掌握了组件通信的定义及一般使用.那么接下来,我们将之前练习过的案例使用组件化思想来实现一下吧. 实例:记事本(组件化) 实现功能 运用组件化思想,实现Vue学习:3.V标签 ...
- 父类和子类对象的获取值的方式验证,通过父类属性的方式获取不到值,需要使用get方法
父类和子类对象的获取值的方式验证,通过父类属性的方式获取不到值,需要使用get方法 静态属性通过类.属性的方式获取,对象获取使用get方法获取 package com.example.core.myd ...
- [翻译].NET 8 的原生AOT及高性能Web开发中的应用[附性能测试结果]
原文: [A Dive into .Net 8 Native AOT and Efficient Web Development] 作者: [sharmila subbiah] 引言 随着 .NET ...
- Ubuntu下nvidia驱动卸载
Ubuntu下nvidia驱动卸载的一种方法 卸掉已经安装的驱动: sudo apt-getremove --purge '^nvidia-.*' sudo apt-getremove --purge ...
- ubuntu 18.04 设置开机自启
ubuntu 18.04 设置开机自启 背景 为了添加一些自定义的服务,例如autossh. 原文(有删改):https://zhuanlan.zhihu.com/p/98804785 介绍 ubun ...