JDBC的批量批量插入

简介:

一. JDBC的批量插入

1.Mysql的驱动jar包选择(重要)

使用MySQL的Batch批量处理,驱动jar包版本需要5.1.13或以上  我使用的驱动版本:mysql-connector-java-5.1.18-bin  (一开始我忽略掉这个jar包的条件要求了,使用的是mysql-connector-java-5.1.6-bin.jar在批处理插入时候效率和普通一样)

2.测试表结构

测试表结构如下:
CREATE TABLE test (
  id int(11) DEFAULT NULL,
  name varchar(20) DEFAULT NULL
) ENGINE=InnoDB 

3.首先使用普通的方式插入100万条数据,使用时间154901毫秒

程序如下:

复制代码
 1     public static void generalInsert() throws ClassNotFoundException,SQLException{
 2         long start = System.currentTimeMillis();
 3         Class.forName("com.mysql.jdbc.Driver");
 4         Connection connection = DriverManager.getConnection(
 5                 "jdbc:mysql://127.0.0.1:3306/kxh", "root", "root");
 6 
 7         connection.setAutoCommit(false);
 8         PreparedStatement cmd = connection
 9                 .prepareStatement("insert into test values(?,?)");
10 
11         for (int i = 0; i < 1000000; i++) {
12             cmd.setInt(1, i);
13             cmd.setString(2, "test");
14             cmd.executeUpdate();
15         }
16         connection.commit();
17 
18         cmd.close();
19         connection.close();
20 
21         long end = System.currentTimeMillis();
22         System.out.println(end - start);//158918毫秒
23     }
复制代码

4.使用批量处理100万条数据,仅用24675毫秒,提升效果非常明显,提升了6倍多.

程序如下:

复制代码
 1     public static void batchInsert() throws ClassNotFoundException, SQLException{
 2         long start = System.currentTimeMillis();
 3         Class.forName("com.mysql.jdbc.Driver");
 4         Connection connection = DriverManager.getConnection(
 5                         "jdbc:mysql://127.0.0.1:3306/kxh?useServerPrepStmts=false&rewriteBatchedStatements=true",
 6                         "root", "root");
 7 
 8         connection.setAutoCommit(false);
 9         PreparedStatement cmd = connection
10                 .prepareStatement("insert into test1 values(?,?)");
11         
12         for (int i = 0; i < 1000000; i++) {//100万条数据
13             cmd.setInt(1, i);
14             cmd.setString(2, "test");
15             cmd.addBatch();
16             if(i%1000==0){
17                 cmd.executeBatch();
18             }
19         }
20         cmd.executeBatch();
21         connection.commit();
22         
23         cmd.close();
24         connection.close();
25         
26         long end = System.currentTimeMillis();

27 System.out.println("批量插入需要时间:"+(end - start)); //批量插入需要时间:24675 28 }
复制代码

 

MySQL 的驱动jar包在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。

与Oracle不同的是,Mysql需要添加rewriteBatchedStatements=true的参数,才可以使用批量处理,否则还是使用逐条处理的方式。另外,有人说rewriteBatchedStatements只对INSERT有效,有人说它对UPDATE/DELETE也有效。

通过试验结论是: 这个选项对INSERT/UPDATE/DELETE都有效,只不过对INSERT它为会预先重排一下SQL语句

5.开启Myslq的查询日志

①批量插入的日志:

开启MySQL的查询日志general_log(关于如何打开,查看mysql的日志请查看博客:http://www.cnblogs.com/DreamDrive/p/5761005.html),发现如下SQL
INSERT INTO test  
VALUES (11, 'test'), (12, 'test'), (13, 'test')......


上下两行的id号码正好相差1000,也就是代码中设置的每1000次提交一次批处理.

②普通插入对应的日志:

如果使用普通的插入打印日志如下:

 

相对Oracle的批量处理,MySQL需要JDBC参数显式开启,并且对于JDBC驱动的版本也有要求。

 参数useServerPrepStmts=false,如果不开启(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement进行本地SQL拼装,最后送到db上就是已经替换了?后的最终SQL.

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5757693.html,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
安全 Java 数据库连接
jdbc解析excel文件,批量插入数据至库中
jdbc解析excel文件,批量插入数据至库中
|
9月前
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
本文以GIS表为例,介绍通过Java代码向数据库插入POINT类型地理数据的方法。首先创建包含ID和POS字段的GIS表,POS字段为ST_GEOMETRY类型。接着利用Java的PreparedStatement批量插入10条经纬度相同的POINT数据,最后查询结果显示成功插入10条记录,验证了操作的正确性。
172 19
|
9月前
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
|
9月前
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
|
SQL Java 关系型数据库
JDBC批量插入mysql数据
JDBC批量插入mysql数据
230 0
|
Java 数据库连接
使用JDBC中的PreparedStatement批量插入
使用JDBC中的PreparedStatement批量插入
|
Java 关系型数据库 MySQL
JDBC学习(八):PreparedStatement实现数据的批量插入
JDBC学习(八):PreparedStatement实现数据的批量插入
418 0
|
SQL 缓存 Java
jdbc之批量插入
jdbc之批量插入
|
SQL 关系型数据库 Java
jdbc批量插入
分享牛,分享牛原创。有这样一个需求,文本文件中的数据批量的插入mysql,怎么用jdbc方式批量插入呢? jdbc默认提供了批量插入的方法,可能用一次就忘记了,这里做笔记记录一下jdbc批量插入吧。
1610 0
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
2605 1