博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL JDBC 的 BATCH 执行和 rewriteBatchedStatements 参数
阅读量:6340 次
发布时间:2019-06-22

本文共 1740 字,大约阅读时间需要 5 分钟。

本来以为这是一个已解决的问题,但是发现有同学不知道,所以写一下。

经常使用 MySQL 的同学可能知道,默认情况下 MySQL JDBC 驱动是不支持 BATCH 的:

try (Connection conn = dataSource.getConnection();    Statement stmt = conn.createStatement()) {    stmt.addBatch("INSERT INTO test (id, name, number, gmt) VALUES (1, 'Adam',  100, NOW())");    stmt.addBatch("INSERT INTO test (id, name, number, gmt) VALUES (2, 'Brown', 200, NOW())");    stmt.addBatch("INSERT INTO test (id, name, number, gmt) VALUES (3, 'Clair', 300, NOW())");    ...    stmt.executeBatch();  } catch (SQLException e) {    e.printStackTrace();}

在真正执行的时候,MySQL JDBC 驱动仍然是把三条语句顺序发给 MySQL 执行。这样其实就是没有 BATCH —— 既没有降低网络通讯的成本,也不能在服务端批量执行。

因此 MySQL JDBC 提供了一个参数 rewriteBatchedStatements 改善这个行为。设置 rewriteBatchedStatements=true 以后,MySQL JDBC 会以两种方式重写批量提交的 SQL 语句,实现一次送达,批量执行的目标:

1) INSERT / INSERT ON DUPLICATE KEY UPDATE / REPLACE (5.1.37+) 会重写成 Multi-Values 的形式,但是限制是必须是使用 PreparedStatement 批量执行的语句。这个限制很容易理解,因为 Statement 提供的 BATCH 接口不能保证批量执行的语句全部是相同类型。

INSERT INTO test (id, name, number, gmt) VALUES     (1, 'Adam',  100, NOW()),     (2, 'Brown', 200, NOW()),     (3, 'Clair', 300, NOW()),     ... [ ON DUPLICATE KEY UPDATE     name   = VALUES(name),     number = VALUES(number),     gmt    = VALUES(gmt),     ... ]

2)重写成 Multi-Query 的形式,简单来说就是在 SQL 间加入分号,合并成一条多语句发给 MySQL 服务端。所有不符合 1) 的都会重写成多语句,但是多语句在 MySQL 服务端的执行效率较低:

UPDATE test SET name = 'Adam',  number = 100, gmt = NOW() WHERE id = 1;UPDATE test SET name = 'Brown', number = 200, gmt = NOW() WHERE id = 2;UPDATE test SET name = 'Clair', number = 300, gmt = NOW() WHERE id = 3;...

特别要注意的一点是:MySQL JDBC 版本在 5.1.37 以下不支持 REPLACE 的 Multi-Values 重写。因此批量 REPLACE 会使用多语句的方式发送到 MySQL 服务端,会观察到 REPLACE 的批量写入效率严重低于 INSERT 和 INSERT ON DUPLICATE KEY UPDATE。

有关 MySQL BATCH 的主要问题就这些,谢谢,做了一些微小的工作。

转载地址:http://fqeoa.baihongyu.com/

你可能感兴趣的文章
UOJ#179. 线性规划(线性规划)
查看>>
整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
查看>>
windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
redis 安装
查看>>
SQL some any all
查看>>
电子书下载:Programming Windows Identity Foundation
查看>>
有理想的程序员必须知道的15件事
查看>>
用于测试的字符串
查看>>
财付通和支付宝资料收集
查看>>
理解 IEnumerable 与 IEnumerator
查看>>
NHibernate 2.0 Beta 1 Released和一些工具
查看>>
【每天一个Linux命令】12. Linux中which命令的用法
查看>>
软件接口数据一致性机制
查看>>
微服务架构介绍和RPC框架对比
查看>>
Debian下使用OpenLDAP 管理端
查看>>
泛型排序器TComparer
查看>>
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
查看>>
Adobe驳斥Flash过度耗电论 称HTML5更耗电
查看>>