JDBC: 批量處理提高SQL處理速度

c6g3 9年前發布 | 3K 次閱讀 Java JDBC

  當需要成批插入或者更新記錄時。可以采用Java的批量更新機制,這一機制允許多條語句一次性提交給數據庫批量處理。通常情況下比單獨提交處理更有效率
JDBC的批量處理語句包括下面兩個方法:
addBatch(String):添加需要批量處理的SQL語句或是參數;
executeBatch();執行批量處理語句;
通常我們會遇到兩種批量執行SQL語句的情況:
多條SQL語句的批量處理;

一個SQL語句的批量傳參;

測試代碼:

    import java.sql.Connection;  
    import java.sql.Date;  
    import java.sql.PreparedStatement;  
    import java.sql.Statement;  

    import org.junit.Test;  

    import xuezaipiao1.JDBC_Tools;  
    /** 
     * 向Oracle 的 temp 數據表中添加  10萬 條記錄 
     * 測試如何插入,用時最短 
     */  

    public class JDBCTest {  

        /** 
         *  
         * 1.使用 Statement . 
         * 測試用時:35535 
         */  
        @Test  
        public void testBbatchStatement() {  
            Connection conn = null;  
            Statement statement = null;  
            String sql = null;  
            try {  
                conn = JDBC_Tools.getConnection();  
                JDBC_Tools.beginTx(conn);  

                long beginTime = System.currentTimeMillis();  
                statement = conn.createStatement();  
                for(int i = 0;i<100000;i++){  
                    sql = "INSERT INTO temp values("+(i+1)  
                            +",'name_"+(i+1)+"','13-6月 -15')";  
                    statement.executeUpdate(sql);  
                }  
                long endTime = System.currentTimeMillis();  
                System.out.println("Time : "+(endTime - beginTime));  
                JDBC_Tools.commit(conn);  
            } catch (Exception e) {  
                e.printStackTrace();  
                JDBC_Tools.rollback(conn);  
            }finally{  
                JDBC_Tools.relaseSource(conn, statement);  
            }  
        }  

        /** 
         * 使用PreparedStatement  
         * 測試用時:9717 
         */  
        @Test  
        public void testBbatchPreparedStatement() {  
            Connection conn = null;  
            PreparedStatement ps = null;  
            String sql = null;  
            try {  
                conn = JDBC_Tools.getConnection();  
                JDBC_Tools.beginTx(conn);  

                long beginTime = System.currentTimeMillis();  
                sql = "INSERT INTO temp values(?,?,?)";  
                ps = conn.prepareStatement(sql);  
                Date date = new Date(new java.util.Date().getTime());  
                for(int i = 0;i<100000;i++){  
                    ps.setInt(1, i+1);  
                    ps.setString(2, "name_"+i);  
                    ps.setDate(3, date);  
                    ps.executeUpdate();//9717  
                }  
                long endTime = System.currentTimeMillis();  
                System.out.println("Time : "+(endTime - beginTime));  
                JDBC_Tools.commit(conn);  
            } catch (Exception e) {  

                e.printStackTrace();  
                JDBC_Tools.rollback(conn);  
            }finally{  
                JDBC_Tools.relaseSource(conn, ps);  
            }  
        }  

        /** 
         * 測試用時 : 658 
         */  
        @Test  
        public void testBbatch() {  
            Connection conn = null;  
            PreparedStatement ps = null;  
            String sql = null;  
            try {  
                conn = JDBC_Tools.getConnection();  
                JDBC_Tools.beginTx(conn);  

                long beginTime = System.currentTimeMillis();  
                sql = "INSERT INTO temp values(?,?,?)";  
                ps = conn.prepareStatement(sql);  
                Date date = new Date(new java.util.Date().getTime());  
                for(int i = 0;i<100000;i++){  
                    ps.setInt(1, i+1);  
                    ps.setString(2, "name_"+i);  
                    ps.setDate(3, date);  

                    //積攢SQL  
                    ps.addBatch();  

                    //當積攢到一定程度,就執行一次,并且清空記錄  
                    if((i+1) % 300==0){  
                        ps.executeBatch();  
                        ps.clearBatch();  
                    }  
                }  
                //總條數不是批量值整數倍,則還需要在執行一次  
                if(100000 % 300 != 0){  
                    ps.executeBatch();  
                    ps.clearBatch();  
                }  
                long endTime = System.currentTimeMillis();  
                System.out.println("Time : "+(endTime - beginTime));  
                JDBC_Tools.commit(conn);  
            } catch (Exception e) {  

                e.printStackTrace();  
                JDBC_Tools.rollback(conn);  
            }finally{  
                JDBC_Tools.relaseSource(conn, ps);  
            }  
        }  
    }  

 本文由用戶 c6g3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!