休眠自动提交命令强制MySQL在过多的磁盘I / O中运行
亲爱的大家,
我敢肯定,你们中的许多人都在使用Hibernate和MySQL,我自己在这里和那里都使用它。 通常,编程模型是不错的,但是普通的JDBC可以快很多已经不是什么秘密了。 在这篇文章中,我想引起您的注意Hibernate在您的MySQL服务器中引起的一个小问题。
如果跟踪Hibernate发送到MySQL数据库的SQL,就会发现一致地,Hibernate以“ SET autocommit = 0”开始每个事务,并以“ commit”结束,然后是“ SET autocommit = 1”。 这些语句看似无害,但它们使MySQL将某些内部状态刷新到磁盘上。 简而言之,每次Hibernate调用这两个语句之一时,MySQL都会编写通常不会编写的内容。 因此,与使用普通JDBC相比,使用Hibernate会使MySQL服务器在磁盘上的依赖更多。
我做了一个小实验来证明这一点。 要重复此实验,请找到带有MySQL数据库的空闲计算机。 机器不应运行任何会导致磁盘I / O的东西,否则效果将不像我看到的那么容易。
首先,我发送了一整串“ SELECT DUAL DUAL;” 命令进入MySQL提示。 像这样:
while true; doecho "SELECT 1 FROM DUAL;"
done | mysql
查看iostat(8)的输出,结果表明机器上没有I / O。 top(1)确实表明机器正在运行。 由此可见,这些SELECT语句不会引起磁盘I / O。
接下来,我添加了Hibernate的自动提交命令,如下所示。
while true; doecho "SET AUTOCOMMIT=0;"echo "SELECT 1 FROM DUAL;"echo "COMMIT;"echo "SET AUTOCOMMIT=1;"
done | mysql
这次,iostat(8)确实表明存在磁盘I / O。 MySQL服务器比以前更努力地工作,同时仍然提供完全相同的答案。 这仅来自单个线程。 您的应用程序可能会在多个线程和连接上同时发出这些语句,从而加剧了问题。
对于无论如何都会导致I / O的查询,我认为这种开销可以忽略不计。 对于小型读取查询,这意味着您突然在数据库服务器上执行磁盘I / O。
我还没有找到一种方法来向Hibernate解释我不想让它将自动提交语句发送到数据库。 您可以在Hibernate中关闭自动提交功能,但是只能关闭Hibernate的内部自动提交功能。 它不会停止将这些命令发送到数据库。
读取Hibernate源代码(尤其是org.hibernate.transaction.JDBCTransaction的源代码)可以看到,休眠使它在每次事务之前强制自动提交连接失败,并在之后重置它。 这是硬编码的。 休眠*想要*自动提交为关闭。
如果我的MySQL服务器仅服务于启用了Hibernate的应用程序,我可能会考虑将数据库服务器的默认自动提交模式关闭。 另外,我可以使用elideSetAutoCommits标志,这可能会减少自动提交切换的数量。 但是,这严重破坏了POLA 。 另外,我的服务器不仅仅提供支持Hibernate的应用程序,因此更改默认设置肯定会破坏其他地方。
所以,这让我陷入困境。 我不能告诉Hibernate不要发出“ SET autocommit”,JDBC驱动程序不会禁止它们,也不能告诉MySQL忽略它们。
参考: Hibernate发送自动提交命令会强制MySQL在Java Monitor论坛上从我们的JCG合作伙伴 Kees Jan 做过多的磁盘I / O。
相关文章:
- Hibernate映射集合性能问题
- DataNucleus 3.0与Hibernate 3.5
- 提升您的休眠引擎
- GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
- JBoss 4.2.x Spring 3 JPA Hibernate教程
翻译自: https://www.javacodegeeks.com/2011/07/hibernate-autocommit-commands-force.html
休眠自动提交命令强制MySQL在过多的磁盘I / O中运行相关推荐
- Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行
亲爱的大家, 我敢肯定,你们中的许多人都在使用Hibernate和MySQL,我自己在这里和那里都使用它. 通常,编程模型是不错的,但是普通的JDBC可以快得多已经不是什么秘密了. 在这篇文章中,我想 ...
- java mysql 自动提交_详解MySQL与Spring的自动提交(autocommit)
1 MySQL的autocommit设置 MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交.如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效 ...
- 【MySQL】MySQL autocommit 以及隐式 自动提交 语句列表
1.概述 MysqL在执行一句数据库操作命令的时候,通常都是自动提交的.常用引擎下有两种,分别是MyIsam和InnoDB,MyIsam是不支持事务处理的,但InnoDB支持,但InnoDB在不开启事 ...
- 【PostgreSQL-9.6.3】设置非自动提交
我们在使用psql工具操作数据库时,事务是自动提交的.也就是说,当我们执行完一条insert或者delete语句后,在不输入commit情况下,这条语句也是提交的.如果不想自动提交,可以使用以下两种方 ...
- MyBatis中设置事务自动提交
MyBatis中设置事务自动提交 MyBatis框架是对JDBC的封装,MyBatis中的事务控制方式其本质也是JDBC的setAutoCommit()方法来设置事务提交的方式的. 1.MyBatis ...
- ESXi通过命令行创建并直通RDM磁盘
背景 本文内容基于ESXi 6.7,其他版本仅供参考.一般情况下,如果硬件支持良好,在虚拟机编辑界面应该能够使用"Add raw disk"的选项,例如当我使用SLI 9200-8 ...
- MySQL事务autocommit自动提交
MySQL事务autocommit自动提交 MySQL默认操作模式就是autocommit自动提交模式.这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行.我们可以通过设置au ...
- 4、MySQL设置事务自动提交(开启和关闭)
MySQL 默认开启事务自动提交模式,即除非显式的开启事务(BEGIN 或 START TRANSACTION),否则每条 SOL 语句都会被当做一个单独的事务自动执行.但有些情况下,我们需要关闭事务 ...
- mysql不自动提交更改语句_MySQL设置事务自动提交(开启和关闭)
MySQL 默认开启事务自动提交模式,即除非显式的开启事务(BEGIN 或 START TRANSACTION),否则每条 SOL 语句都会被当做一个单独的事务自动执行.但有些情况下,我们需要关闭事务 ...
最新文章
- 写给工程师的十条精进原则
- python无法识别vim中文代码
- 在jsp中应如何避免,request.getContextPath();等get报错问题
- esp32 rtc 时钟设置不对_STM32入门系列-STM32时钟系统,STM32时钟树
- dgi数据治理_荐书 | 5G时代组织急需数据体检
- shell预先定义的特殊变量
- layui向body添加html_layui 各项配置
- java ArrayList集合
- 基于MATLAB步态算法仿真的六足仿生机器人
- 矩阵求导及其链式法则
- HTML段落前面怎么加黑点,Word文档段落前面的那个小黑点,是怎么搞出来得呀?...
- html浏览xsd,那点你不知道的XHtml(Xml+Html)语法知识(DTD、XSD)
- 【已解决】戴尔笔记本wifi速度慢的问题。
- ISP(八) Gamma原理详解
- 【LNK2019】 无法解析的外部符号 __iob
- MATLAB解决工业机器人建模笔记——atan2函数MATLAB实现
- JavaScript 判断国内外浏览器类型和内核(含360,QQ,搜狗等)
- three.js渲染带动画的glb文件(内附源码,保姆级)
- C++ random库
- Redis 持久化 RDB/AOF 详解与实践
热门文章
- 等价关系和等价类_确定Java等价性的新时代?
- go比java快多少_Java 11快多少?
- gradle使用maven_使用Gradle – 2019版从Travis可靠发布到Maven Central
- java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...
- openshift_在OpenShift上扩展Java EE微服务
- java包装模式_在Java8中包装设计模式
- netflix_学习Netflix管理员–第2部分
- 针对JDK 14提议的另外六个JEP
- 无服务器-仅仅是构建现代应用程序的一种方法?
- netbeans7.4_使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试