| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
c6g3
10年前发布

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

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