由 BatchSqlUpdate 引发的思考
背景
基于以往的经验,在 Oracle 数据库上做批量操作时,一般是使用 Spring 的 BatchSQLUpdate
工具类,可以提高批量操作性能。熟悉 BatchSQLUpdate 的同学应该知道,该工具类是主要
是基于 JDBC 驱动的 PreparedStatement.addBatch 方式来实现批量操作的。但是,笔者所在
公司从 Oracle 数据库迁移到 MySQL 数据库后,有一些本来很快的批量操作接口就变很慢了,
既使用 BatchSQLUpdate 工具类在 MySQL 数据库做批量操作的性能很差。
所以笔者对 BatchSQLUpdate 工具类和 JDBC 驱动的实现做了一些探究。本文中所例举的示
例和测试均是使用 5.7 版本的 MySQL 数据库,和 Connector/J 5.1.34 版本的驱动。
JDBC 探究之旅
首先是用 Spring 的 BatchSqlUpdate 类对 10000 条数据做批量操作,测试后发现:
需要 9s 左右,这跟使用 Oracle 数据库时相差一个量级,性能相差那么大肯定是有原因的,
开始笔者怀疑会不会是 MySQL 的 JDBC 驱动批量操作(addBatch 的方式)没有效果导致的,
为了验证自己的猜想,笔者通过简单的测试(for 循环插入 10000 条数据),测试发现 for
循环插入数据的方式和使用 BatchSqlUpdate 批量插入数据的方式,在性能上是相差无几的,
这也就佐证了笔者的猜想。当然,这就直接下结论的话是不够严谨,需要更直接的证明
(查看 MySQL 服务器的执行的 SQL),于是笔者开启 MySQL 的慢日志功能并把慢日志时间
改为 0,既把数据库所有的操作都记录为慢日志(具体的操作笔者在这里不做详细说明,
有 兴 趣 的 读 者 可 以 上 网 了 解 ) , 方 便 跟 踪 问 题 ; 开 启 慢 日 志 功 能 后 , 再 使 用
BatchSqlUpdate 做批量操作,可以查看 MySQL 的慢日志文件,如下图:
1
评论0