java使用JDBC向MySQL数据库批次插入10W条数据测试效率

news/2024/5/19 0:01:36 标签: java, jdbc, 批量插入

使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?
在JDBC编程接口中Statement 有两个方法特别值得注意:
通过使用addBatch()和executeBatch()这一对方法可以实现批量处理数据。
不过值得注意的是,首先需要在数据库链接中设置手动提交,connection.setAutoCommit(false),然后在执行Statement之后执行connection.commit()。

import java.io.BufferedReader;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import com.mysql.jdbc.Connection;
public class MysqlBatchUtil {
    private String sql="INSERT INTO db_test (param1,param2,param3,param4,param5) VALUES (?,?,?,?,?)";  
    private String charset="utf-8";  
    private String connectStr="jdbc:mysql://localhost:3306/test";
    private String username="root";  
    private String password="123456";  
    private void doStore() throws ClassNotFoundException, SQLException, IOException {  
        Class.forName("com.mysql.jdbc.Driver");  
        connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";//此处是测试高效批次插入,去掉之后执行时普通批次插入
        Connection conn = (Connection) DriverManager.getConnection(connectStr, username,password);  
        conn.setAutoCommit(false); // 设置手动提交  
        int count = 0;  
        PreparedStatement psts = conn.prepareStatement(sql);  
        String line = null;  
        Date begin=new Date();
        for(int i=0;i<=100000;i++){
            psts.setString(1, i+"param1");  
            psts.setString(2, i+"param2");  
            psts.setString(3, i+"param3");  
            psts.setString(4, i+"param4");  
            psts.setString(5, i+"param5");  
            psts.addBatch();          // 加入批量处理  
            count++;      
        }  
        psts.executeBatch(); // 执行批量处理  
        conn.commit();  // 提交  
        Date end=new Date();
        System.out.println("数量="+count);  
        System.out.println("运行时间="+(end.getTime()-begin.getTime()));
        conn.close();  
    }  
    public static void main(String[] args) {
        try {
            new MysqlBatchUtil().doStore();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试结果:

数量=100001
运行时间=4725

一共10W,执行时间一共花费 47 秒.
这个效率仍然不高,似乎没有达到想要的效果,需要进一步改进。
在MySQL JDBC连接字符串中还可以加入参数,
rewriteBatchedStatements=true
mysql默认关闭了batch处理,通过此参数进行打开,这个参数可以重写向数据库提交的SQL语句
useServerPrepStmts=false
如果不开启(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement进行本地SQL拼装,最后送到db上就是已经替换了?后的最终SQL.
在此稍加改进,连接字符串中加入下面语句(代码构造方法中去掉注释):
connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";
再次测试结果如下:

数量=100001
运行时间=1213

同样的数据量,这次执行只花费了12秒 ,由此可见处理效率大大提高

转载自:https://www.cnblogs.com/wangyayun/archive/2016/12/29/6231832.html


http://www.niftyadmin.cn/n/1481285.html

相关文章

Json 转换

1字典转JSON字符串 //NSDictionary转换为Data NSData* jsonData [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil]; //Data转换为JSON NSString* str [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];转…

springboot+maven+idea打包及部署到tomcat服务器(腾讯云)

说明&#xff1a;我项目使用的是JDK1.8springboot内置tomcat&#xff0c;腾讯云服务器为window系列。已经尝试过打包成功且部署到服务器上。 如果你的版本和我的不一样&#xff0c;那么不能保证一定成功。 打包前注意&#xff1a; &#xff08;1&#xff09;第一步&#xff0…

CentOS 6.5 mysql切换存储目录

mkdir /disk/mysql /etc/my.cnf中的/var/lib/mysql 换成/disk/mysql /etc/init.d/mysqld 中的/var/lib/mysql 换成/disk/mysql /usr/bin/mysqld_safe中的/var/lib/mysql换成/disk/mysql setenforce 0 如果要外部访问&#xff0c;/etc/sysconfig/iptables中添加相应的端口 …

git检出一系列配置到正常运行

一&#xff1a;导入git程序 1.准备 git链接 IDEA软件&#xff0c;最好是终极版 2.第一步选择从版本控制上选择git 3.拷贝源于目标地址 4.这时候根据引导进行下一步即可 这时可以进入项目。 5.选择git项目分支 二&#xff1a;配置jdk 1.前提 前提是将JDK的配置环境已经配置完成…

聚类评价指标

一、引言 如图认为x代表一类文档&#xff0c;o代表一类文档&#xff0c;方框代表一类文档&#xff0c;完美的聚类显然是应该把各种不同的图形放入一类&#xff0c;事实上我们很难找到完美的聚类方法&#xff0c;各种方法在实际中难免有偏差&#xff0c;所以我们才需要对聚类算法…

时间类型TimeStamp前后台处理操作

前言&#xff1a;因为想要页面显示年月日时分秒&#xff0c;所以我用的是timestamp类型&#xff0c;效果如下&#xff1a; 之后点击保存&#xff0c;数据库效果如下&#xff1a; 首先&#xff1a;我们的entity如下&#xff1a;可知用的是timestamp类型 前台页面为&#xff1a;注…

基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

(转自&#xff1a;http://blog.sina.com.cn/s/blog_5eca668b01018949.html)定义一个类&#xff0c;来对远程X.509证书的验证&#xff0c;进行处理&#xff0c;返回为true.我们要自己定义一个类&#xff0c;然后在客户单调用WCF服务之前&#xff0c;执行一次即可。代码如下&…

防火墙导致web访问不到服务器解决方法

服务器在运行时为了安全&#xff0c;必须开启防火墙&#xff0c;但是在将防火墙全部开启之后&#xff0c;外部就不能访问应用了&#xff0c;在这种情况下&#xff0c;需要我们自己手动配置如站规则&#xff0c;主要是添加端口的入站规则&#xff0c;80&#xff0c;443&#xff…