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

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

  当需要成批插入或者更新记录时。可以采用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);  
            }  
        }  
    }