天天看點

JDBC批量Insert深度優化(有事務)

SQL代碼

DROP TABLE IF EXISTS tuser; 

CREATE TABLE tuser ( 

    id bigint(20) NOT NULL AUTO_INCREMENT, 

    name varchar(12) DEFAULT NULL, 

    remark varchar(24) DEFAULT NULL, 

    createtime datetime DEFAULT NULL, 

    updatetime datetime DEFAULT NULL, 

    PRIMARY KEY (id) 

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

C、D組測試代碼:

package testbatch; 

import java.io.IOException; 

import java.sql.*; 

/** 

* JDBC批量Insert優化(下) 

* @author leizhimin 2009-7-29 10:03:10 

*/ 

public class TestBatch { 

        public static DbConnectionBroker myBroker = null; 

        static { 

                try { 

                        myBroker = new DbConnectionBroker("com.mysql.jdbc.Driver", 

                                        "jdbc:mysql://192.168.104.163:3306/testdb", 

                                        "vcom", "vcom", 2, 4, 

                                        "c:\\testdb.log", 0.01); 

                } catch (IOException e) { 

                        e.printStackTrace(); 

                } 

        } 

        /** 

         * 初始化測試環境 

         * 

         * @throws SQLException 異常時抛出 

         */ 

        public static void init() throws SQLException { 

                Connection conn = myBroker.getConnection(); 

                conn.setAutoCommit(false); 

                Statement stmt = conn.createStatement(); 

                stmt.addBatch("DROP TABLE IF EXISTS tuser"); 

                stmt.addBatch("CREATE TABLE tuser (\n" + 

                                "    id bigint(20) NOT NULL AUTO_INCREMENT,\n" + 

                                "    name varchar(12) DEFAULT NULL,\n" + 

                                "    remark varchar(24) DEFAULT NULL,\n" + 

                                "    createtime datetime DEFAULT NULL,\n" + 

                                "    updatetime datetime DEFAULT NULL,\n" + 

                                "    PRIMARY KEY (id)\n" + 

                                ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8"); 

                stmt.executeBatch(); 

                conn.commit(); 

                myBroker.freeConnection(conn); 

         * 100000條靜态SQL插入 

         * @throws Exception 異常時抛出 

        public static void testInsert() throws Exception { 

                init();         //初始化環境 

                Long start = System.currentTimeMillis(); 

                for (int i = 0; i < 100000; i++) { 

                        String sql = "\n" + 

                                        "insert into testdb.tuser \n" + 

                                        "\t(name, \n" + 

                                        "\tremark, \n" + 

                                        "\tcreatetime, \n" + 

                                        "\tupdatetime\n" + 

                                        "\t)\n" + 

                                        "\tvalues\n" + 

                                        "\t('" + RandomToolkit.generateString(12) + "', \n" + 

                                        "\t'" + RandomToolkit.generateString(24) + "', \n" + 

                                        "\tnow(), \n" + 

                                        "\tnow()\n" + 

                                        ")"; 

                        Connection conn = myBroker.getConnection(); 

                        conn.setAutoCommit(false); 

                        Statement stmt = conn.createStatement(); 

                        stmt.execute(sql); 

                        conn.commit(); 

                        myBroker.freeConnection(conn); 

                Long end = System.currentTimeMillis(); 

                System.out.println("單條執行100000條Insert操作,共耗時:" + (end - start) / 1000f + "秒!"); 

         * 批處理執行靜态SQL測試 

         * @param m 批次 

         * @param n 每批數量 

        public static void testInsertBatch(int m, int n) throws Exception { 

                init();             //初始化環境 

                for (int i = 0; i < m; i++) { 

                        //從池中擷取連接配接 

                        for (int k = 0; k < n; k++) { 

                                String sql = "\n" + 

                                                "insert into testdb.tuser \n" + 

                                                "\t(name, \n" + 

                                                "\tremark, \n" + 

                                                "\tcreatetime, \n" + 

                                                "\tupdatetime\n" + 

                                                "\t)\n" + 

                                                "\tvalues\n" + 

                                                "\t('" + RandomToolkit.generateString(12) + "', \n" + 

                                                "\t'" + RandomToolkit.generateString(24) + "', \n" + 

                                                "\tnow(), \n" + 

                                                "\tnow()\n" + 

                                                ")"; 

                                //加入批處理 

                                stmt.addBatch(sql); 

                        } 

                        stmt.executeBatch();    //執行批處理 

//                        stmt.clearBatch();        //清理批處理 

                        stmt.close(); 

                        myBroker.freeConnection(conn); //連接配接歸池 

                System.out.println("批量執行" + m + "*" + n + "=" + m * n + "條Insert操作,共耗時:" + (end - start) / 1000f + "秒!"); 

         * 100000條預定義SQL插入 

        public static void testInsert2() throws Exception {     //單條執行100000條Insert操作,共耗時:40.422秒! 

                String sql = "" + 

                                "insert into testdb.tuser\n" + 

                                "    (name, remark, createtime, updatetime)\n" + 

                                "values\n" + 

                                "    (?, ?, ?, ?)"; 

                        PreparedStatement pstmt = conn.prepareStatement(sql); 

                        pstmt.setString(1, RandomToolkit.generateString(12)); 

                        pstmt.setString(2, RandomToolkit.generateString(24)); 

                        pstmt.setDate(3, new Date(System.currentTimeMillis())); 

                        pstmt.setDate(4, new Date(System.currentTimeMillis())); 

                        pstmt.executeUpdate(); 

                        pstmt.close(); 

         * 批處理執行預處理SQL測試 

        public static void testInsertBatch2(int m, int n) throws Exception { 

                                pstmt.setString(1, RandomToolkit.generateString(12));