• 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 }
  • 相关阅读:
    Oracle面试题目及解答
    java -jar Incompatible argument to function
    plsql 查询到别的用户下面的表
    redis数据类型[string 、list 、 set 、sorted set 、hash]
    redis-cli 常用命令
    js判断浏览器,包括Edge浏览器
    HTMl5的sessionStorage和localStorage
    JS实现密码加密
    sprintf.js
    js-crc32
  • 原文地址:https://www.cnblogs.com/wucongyun/p/6556824.html
Copyright © 2020-2023  润新知