亲爱的大家,

我敢肯定,你们中的许多人都在使用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的源代码)可以看到,Hibernate使它在每次事务处理之前强制自动提交连接为假,并在之后进行重置。 这是硬编码的。 Hibernate*想要*自动提交关闭。

如果我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
  • 提升您的Hibernate引擎
  • 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

Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行相关推荐

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

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

  2. Springboot 之 Hibernate自动建表(Mysql)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 引入Maven依赖包 <dependency><groupId>org.sp ...

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

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

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

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

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

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

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

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

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

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

  8. MySQL事务autocommit自动提交

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

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

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

最新文章

  1. Java程序员3面小米,被俩算法题难倒,微软员工6分钟解决,真丢脸
  2. HDU 4857 Couple doubi(找循环节)
  3. C#正则表达式编程(三):Match类和Group类用法
  4. CentOS6.5编译安装apache2.4--有软件包!
  5. c语言if语句条件是字母,C语言的if语句中,用作判断的条件表达式为()
  6. 缓存穿透,瞬间并发,缓存雪崩的解决方法
  7. 从零开始编写自己的C#框架(1)——前言
  8. 查看linux服务器信息
  9. (转)asp.net2.0 上传大容量文件第三方控件radupload
  10. python并发处理机制_Python并发处理
  11. 千兆交换机下面可以接多少层交换机_视频监控系统如何选择网络交换机
  12. python零基础入门视频免费-阿里云免费推出Python零基础入门在线教程视频
  13. java开发之权限管理详解
  14. android手机怎么改字体,手机字体怎么改 安卓手机字体修改教程
  15. Socket通讯连接常见错误代码
  16. 38岁女强人转行做足疗店,只用一年就把两家同行都挤垮了?
  17. excel筛选后复制粘贴
  18. 关于小米安装app的问题
  19. 我有酒,你有故事吗?
  20. Arduino开发:网页控制ESP8266三色LED灯闪烁

热门文章

  1. 人脸注册源码faceregiste
  2. win10打字突然变成繁体
  3. python3.0什么时候发布的_Django 3.0 发布说明
  4. raid配置ssd为缓存_超融合硬件选配推荐指南 | 第三期:SSD 与 HDD
  5. ping 命令使用代理_网络检测知识篇:ping命令使用知识,你知道几点?
  6. python重定向到socket_python套接字流重定向实例汇总
  7. javafx 打开新窗口_新的JMetro JavaFX 11兼容版本
  8. java ee的小程序_用微服务和容器替换旧版Java EE应用程序服务器
  9. hystrix应用 博客_使用Hystrix DSL创建弹性骆驼应用程序
  10. hystrix熔断 简介_Hystrix简介– Hello World