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

引用:忘了

 

当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率
JDBC的批量处理语句包括下面两个方法:
addBatch(String):添加需要批量处理的SQL语句或是参数;
executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
多条SQL语句的批量处理;

一个SQL语句的批量传参;

测试代码:

  1 import java.sql.Connection;
  2 import java.sql.Date;
  3 import java.sql.PreparedStatement;
  4 import java.sql.Statement;
  5  
  6 import org.junit.Test;
  7  
  8 import xuezaipiao1.JDBC_Tools;
  9 /**
 10  * 向Oracle 的 temp 数据表中添加  10万 条记录
 11  * 测试如何插入,用时最短
 12  */
 13  
 14 public class JDBCTest {
 15      
 16     /**
 17      *
 18      * 1.使用 Statement .
 19      * 测试用时:35535
 20      */
 21     @Test
 22     public void testBbatchStatement() {
 23         Connection conn = null;
 24         Statement statement = null;
 25         String sql = null;
 26         try {
 27             conn = JDBC_Tools.getConnection();
 28             JDBC_Tools.beginTx(conn);
 29              
 30             long beginTime = System.currentTimeMillis();
 31             statement = conn.createStatement();
 32             for(int i = 0;i<100000;i++){
 33                 sql = "INSERT INTO temp values("+(i+1)
 34                         +",'name_"+(i+1)+"','13-6月 -15')";
 35                 statement.executeUpdate(sql);
 36             }
 37             long endTime = System.currentTimeMillis();
 38             System.out.println("Time : "+(endTime - beginTime));
 39             JDBC_Tools.commit(conn);
 40         } catch (Exception e) {
 41             e.printStackTrace();
 42             JDBC_Tools.rollback(conn);
 43         }finally{
 44             JDBC_Tools.relaseSource(conn, statement);
 45         }
 46     }
 47      
 48     /**
 49      * 使用PreparedStatement
 50      * 测试用时:9717
 51      */
 52     @Test
 53     public void testBbatchPreparedStatement() {
 54         Connection conn = null;
 55         PreparedStatement ps = null;
 56         String sql = null;
 57         try {
 58             conn = JDBC_Tools.getConnection();
 59             JDBC_Tools.beginTx(conn);
 60              
 61             long beginTime = System.currentTimeMillis();
 62             sql = "INSERT INTO temp values(?,?,?)";
 63             ps = conn.prepareStatement(sql);
 64             Date date = new Date(new java.util.Date().getTime());
 65             for(int i = 0;i<100000;i++){
 66                 ps.setInt(1, i+1);
 67                 ps.setString(2, "name_"+i);
 68                 ps.setDate(3, date);
 69                 ps.executeUpdate();//9717
 70             }
 71             long endTime = System.currentTimeMillis();
 72             System.out.println("Time : "+(endTime - beginTime));
 73             JDBC_Tools.commit(conn);
 74         } catch (Exception e) {
 75              
 76             e.printStackTrace();
 77             JDBC_Tools.rollback(conn);
 78         }finally{
 79             JDBC_Tools.relaseSource(conn, ps);
 80         }
 81     }
 82          
 83     /**
 84      * 测试用时 : 658
 85      */
 86     @Test
 87     public void testBbatch() {
 88         Connection conn = null;
 89         PreparedStatement ps = null;
 90         String sql = null;
 91         try {
 92             conn = JDBC_Tools.getConnection();
 93             JDBC_Tools.beginTx(conn);
 94              
 95             long beginTime = System.currentTimeMillis();
 96             sql = "INSERT INTO temp values(?,?,?)";
 97             ps = conn.prepareStatement(sql);
 98             Date date = new Date(new java.util.Date().getTime());
 99             for(int i = 0;i<100000;i++){
100                 ps.setInt(1, i+1);
101                 ps.setString(2, "name_"+i);
102                 ps.setDate(3, date);
103                  
104                 //积攒SQL
105                 ps.addBatch();
106                  
107                 //当积攒到一定程度,就执行一次,并且清空记录
108                 if((i+1) % 300==0){
109                     ps.executeBatch();
110                     ps.clearBatch();
111                 }
112             }
113             //总条数不是批量值整数倍,则还需要在执行一次
114             if(100000 % 300 != 0){
115                 ps.executeBatch();
116                 ps.clearBatch();
117             }
118             long endTime = System.currentTimeMillis();
119             System.out.println("Time : "+(endTime - beginTime));
120             JDBC_Tools.commit(conn);
121         } catch (Exception e) {
122              
123             e.printStackTrace();
124             JDBC_Tools.rollback(conn);
125         }finally{
126             JDBC_Tools.relaseSource(conn, ps);
127         }
128     }
129 }

 

转载于:https://www.cnblogs.com/wucongyun/p/6556824.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值