• 【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){
    
            }
        }
    }
  • 相关阅读:
    android中textview字数过长解决方法
    Android的EditText无法自动弹出输入法问题 .
    android中dip、dp、px、sp和屏幕密度
    android横竖屏切换 判断activity 是横屏还是竖屏
    设置ListView中图片的大小大方法 Android
    TextView属性详细分析
    ArcGIS API For Silverlight 实例分析
    Visual Studio 2008 里修改数据库表结构报错 解决办法
    未能加载文件或程序集“xxx”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集
    SuperMap iClient 6R for Silverlight 产品简介及Beta测试软件下载地址
  • 原文地址:https://www.cnblogs.com/ygj0930/p/5861959.html
Copyright © 2020-2023  润新知