Hibernate自动提交命令强制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的源代码)可以看到,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中运行相关推荐
- 休眠自动提交命令强制MySQL在过多的磁盘I / O中运行
亲爱的大家, 我敢肯定,你们中的许多人都在使用Hibernate和MySQL,我自己在这里和那里都使用它. 通常,编程模型是不错的,但是普通的JDBC可以快很多已经不是什么秘密了. 在这篇文章中,我想 ...
- Springboot 之 Hibernate自动建表(Mysql)
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 引入Maven依赖包 <dependency><groupId>org.sp ...
- 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 语句都会被当做一个单独的事务自动执行.但有些情况下,我们需要关闭事务 ...
最新文章
- Java程序员3面小米,被俩算法题难倒,微软员工6分钟解决,真丢脸
- HDU 4857 Couple doubi(找循环节)
- C#正则表达式编程(三):Match类和Group类用法
- CentOS6.5编译安装apache2.4--有软件包!
- c语言if语句条件是字母,C语言的if语句中,用作判断的条件表达式为()
- 缓存穿透,瞬间并发,缓存雪崩的解决方法
- 从零开始编写自己的C#框架(1)——前言
- 查看linux服务器信息
- (转)asp.net2.0 上传大容量文件第三方控件radupload
- python并发处理机制_Python并发处理
- 千兆交换机下面可以接多少层交换机_视频监控系统如何选择网络交换机
- python零基础入门视频免费-阿里云免费推出Python零基础入门在线教程视频
- java开发之权限管理详解
- android手机怎么改字体,手机字体怎么改 安卓手机字体修改教程
- Socket通讯连接常见错误代码
- 38岁女强人转行做足疗店,只用一年就把两家同行都挤垮了?
- excel筛选后复制粘贴
- 关于小米安装app的问题
- 我有酒,你有故事吗?
- Arduino开发:网页控制ESP8266三色LED灯闪烁
热门文章
- 人脸注册源码faceregiste
- win10打字突然变成繁体
- python3.0什么时候发布的_Django 3.0 发布说明
- raid配置ssd为缓存_超融合硬件选配推荐指南 | 第三期:SSD 与 HDD
- ping 命令使用代理_网络检测知识篇:ping命令使用知识,你知道几点?
- python重定向到socket_python套接字流重定向实例汇总
- javafx 打开新窗口_新的JMetro JavaFX 11兼容版本
- java ee的小程序_用微服务和容器替换旧版Java EE应用程序服务器
- hystrix应用 博客_使用Hystrix DSL创建弹性骆驼应用程序
- hystrix熔断 简介_Hystrix简介– Hello World