zoukankan      html  css  js  c++  java
  • 【JDBC】Mysql海量数据插入——PreparedStatement加快数据插入

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5861959.html

    使用JDBC连接数据库时,如果插入的数据量大,一条一条地插入数据会变得非常缓慢。此时,我们需要用到预处理。

    查阅Java开发文档,我们可以看到:

    接口 PreparedStatement

    表示预编译的 SQL 语句的对象。

    SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。 

    我的理解是,preparedstatement对象相当于sql语句执行前的一个加工站,对sql语句进行具体的数据填充。

    大概的使用流程是:

    1:使用BufferedString构建一个同时插入N条数据的语句模版;

    2:利用模版生成字符串语句,将该语句作为参数构建一个PreparedStatement对象pst,意指用pst对参数语句进行预处理;

    3:用pst对象调用方法对参数语句进行预处理:pst.setXX(index,value)等语句把参数语句进行具体的数据填充;

    4:执行经过pst处理过后的具体sql语句:pst.execute();

    5:关闭pst对象;

    画图理解:

    代码示例:

    import java.net.*;
    import java.io.*;
    import java.sql.*;
    
    public class Insert
    {
    
        public static void main(String[] args)
        { Connection conn=null;
            try{
                Class.forName("com.mysql.jdbc.Driver");
                conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/inserttest","root","123456");
                conn.setAutoCommit(false);
    
    //使用缓冲字符串构造一个同时插入10000条数据的语句模版
                StringBuffer sqlBuffer = new StringBuffer(
                        "insert into test (Col1,Col2,Col3) values");
                sqlBuffer.append("(?,?,?)");
                for (int j = 2; j <= 10000; j++) {
                    sqlBuffer.append(",(?,?,?)");
                }
                sqlBuffer.append(";");
                String sql = new String(sqlBuffer);
    
    //SQL语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。在使用该语句时可以根据下标自行更改具体数据
                PreparedStatement pst = conn.prepareStatement(sql);
                System.out.println("start!");
                Long beginTime = System.currentTimeMillis();
                for (int i = 0; i < 100; i++) {
                    System.out.println("No."+(i+1)+"round...");
                    for (int j = 0; j < 10000; j++) {
    //每次插入时,具体的数据通过pst.setXXX(index,value)来赋值
                        pst.setInt(3 * j + 1, (int) (Math.random() * 11)+1);
                        pst.setInt(3 * j + 2, (int) (Math.random() * 112)+2);
                        pst.setInt(3 * j + 3, (int) (Math.random() * 133)+5);
                    }
    //每条sql语句插入10000条数据,执行100条sql
                    pst.execute();
                }
                conn.commit();
                pst.close();
                Long endTime = System.currentTimeMillis();
                System.out.println("end!");
                System.out.println("total time: " + (double) (endTime - beginTime)/1000 + " s");
                System.out.println();
            }catch(Exception ex){
    
            }
        }
    }
  • 相关阅读:
    MYSQL批量插入数据库实现语句性能分析【转】 批量插入!程序里面对于数据库插入的功能尽量用【异步处理+批量插入+(事务)】
    移动端如何解决页面返回上次浏览位置问题
    php对接java接口
    php后端遇到的问题
    jquery 判断字符串长度
    phpExcel常用方法详解
    html 手机端适配不同手机高度 ,把内容居中显示
    html 手机端 生成海报
    没错,老师就是个勤奋负责有良心的职业,不,的人
    睡眠是自然的第二道菜
  • 原文地址:https://www.cnblogs.com/ygj0930/p/5861959.html
Copyright © 2011-2022 走看看