亲爱的大家,

我敢肯定,你们中的许多人都在使用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中运行相关推荐

  1. Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行

    亲爱的大家, 我敢肯定,你们中的许多人都在使用Hibernate和MySQL,我自己在这里和那里都使用它. 通常,编程模型是不错的,但是普通的JDBC可以快得多已经不是什么秘密了. 在这篇文章中,我想 ...

  2. java mysql 自动提交_详解MySQL与Spring的自动提交(autocommit)

    1 MySQL的autocommit设置 MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交.如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效 ...

  3. 【MySQL】MySQL autocommit 以及隐式 自动提交 语句列表

    1.概述 MysqL在执行一句数据库操作命令的时候,通常都是自动提交的.常用引擎下有两种,分别是MyIsam和InnoDB,MyIsam是不支持事务处理的,但InnoDB支持,但InnoDB在不开启事 ...

  4. 【PostgreSQL-9.6.3】设置非自动提交

    我们在使用psql工具操作数据库时,事务是自动提交的.也就是说,当我们执行完一条insert或者delete语句后,在不输入commit情况下,这条语句也是提交的.如果不想自动提交,可以使用以下两种方 ...

  5. MyBatis中设置事务自动提交

    MyBatis中设置事务自动提交 MyBatis框架是对JDBC的封装,MyBatis中的事务控制方式其本质也是JDBC的setAutoCommit()方法来设置事务提交的方式的. 1.MyBatis ...

  6. ESXi通过命令行创建并直通RDM磁盘

    背景 本文内容基于ESXi 6.7,其他版本仅供参考.一般情况下,如果硬件支持良好,在虚拟机编辑界面应该能够使用"Add raw disk"的选项,例如当我使用SLI 9200-8 ...

  7. MySQL事务autocommit自动提交

    MySQL事务autocommit自动提交 MySQL默认操作模式就是autocommit自动提交模式.这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行.我们可以通过设置au ...

  8. 4、MySQL设置事务自动提交(开启和关闭)

    MySQL 默认开启事务自动提交模式,即除非显式的开启事务(BEGIN 或 START TRANSACTION),否则每条 SOL 语句都会被当做一个单独的事务自动执行.但有些情况下,我们需要关闭事务 ...

  9. mysql不自动提交更改语句_MySQL设置事务自动提交(开启和关闭)

    MySQL 默认开启事务自动提交模式,即除非显式的开启事务(BEGIN 或 START TRANSACTION),否则每条 SOL 语句都会被当做一个单独的事务自动执行.但有些情况下,我们需要关闭事务 ...

最新文章

  1. 写给工程师的十条精进原则
  2. python无法识别vim中文代码
  3. 在jsp中应如何避免,request.getContextPath();等get报错问题
  4. esp32 rtc 时钟设置不对_STM32入门系列-STM32时钟系统,STM32时钟树
  5. dgi数据治理_荐书 | 5G时代组织急需数据体检
  6. shell预先定义的特殊变量
  7. layui向body添加html_layui 各项配置
  8. java ArrayList集合
  9. 基于MATLAB步态算法仿真的六足仿生机器人
  10. 矩阵求导及其链式法则
  11. HTML段落前面怎么加黑点,Word文档段落前面的那个小黑点,是怎么搞出来得呀?...
  12. html浏览xsd,那点你不知道的XHtml(Xml+Html)语法知识(DTD、XSD)
  13. 【已解决】戴尔笔记本wifi速度慢的问题。
  14. ISP(八) Gamma原理详解
  15. 【LNK2019】 无法解析的外部符号 __iob
  16. MATLAB解决工业机器人建模笔记——atan2函数MATLAB实现
  17. JavaScript 判断国内外浏览器类型和内核(含360,QQ,搜狗等)
  18. three.js渲染带动画的glb文件(内附源码,保姆级)
  19. C++ random库
  20. Redis 持久化 RDB/AOF 详解与实践

热门文章

  1. 等价关系和等价类_确定Java等价性的新时代?
  2. go比java快多少_Java 11快多少?
  3. gradle使用maven_使用Gradle – 2019版从Travis可靠发布到Maven Central
  4. java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...
  5. openshift_在OpenShift上扩展Java EE微服务
  6. java包装模式_在Java8中包装设计模式
  7. netflix_学习Netflix管理员–第2部分
  8. 针对JDK 14提议的另外六个JEP
  9. 无服务器-仅仅是构建现代应用程序的一种方法?
  10. netbeans7.4_使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试