Java JDBC批量插入和单条插入执行耗时

一)单条插入

原理:用一个for循环往数据库表中插入10w条数据,循环一次提交一次事务,观察单条插入执行时间。

源码:

package com.oysept.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.oysept.utils.OracleJDBC;

public class TestInsert {

    public static void main(String[] args) {
        executeInsert();
    }

    public static void executeInsert() {
        Long begin = System.currentTimeMillis();
		
        String sql = "INSERT INTO tab_test values(?,?)"; // 新增数据
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = OracleJDBC.getConnection();
            ps = conn.prepareStatement(sql);
            for (int i = 1; i <= 1000000; i++) {
                ps.setInt(1, i);
                ps.setString(2, "第"+i+"行数据");
                // 执行SQL
                ps.execute();
            }
        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            try {
                if (ps != null) {
                    ps.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                System.out.println(e);
            }
        }
        Long end = System.currentTimeMillis();
        System.out.println("JDBC单条插入数据, 总耗时" + (end-begin) + "毫秒");
    }
}

执行时间:单条往数据库表中插入100w数据,大约花费30多秒(在一张空表插入数据)

 

二)批量插入

原理:用一个for循环往数据库表中插入10w条数据,循环的时候,当循环次数达到设定提交的数量,就提交一次数据库事务,观察批量插入执行时间。

 

注意:批量插入的时候,需要考虑插入SQL的长度,如果SQL非常长,可能会执行报错。一般的做法是,把SQL拼接到一定长度时,先把这次的结果提交,再进行下一循环批次操作,即分批操作。

源码:

package com.oysept.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.oysept.utils.OracleJDBC;

/**
 * JDBC批量新增数据
 * @author ouyangjun
 */
public class TestBatchInsert {
	
    public static void main(String[] args) {
        batchInsert();
    }
	
    public static void batchInsert() {
        Long begin = System.currentTimeMillis();
		
        String sql = "INSERT INTO tab_test values(?,?)"; // 新增数据
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = OracleJDBC.getConnection();
            ps = conn.prepareStatement(sql);
            conn.setAutoCommit(false); // 先设置不自动提交事务
            
            for (int i = 1; i <= 1000000; i++) {
                ps.setInt(1, i);
                ps.setString(2, "第"+i+"行数据");
                ps.addBatch();
            	
                // 每循环1000次,提交一遍事务
                if (i % 1000 == 0) {
                    ps.executeBatch();
                    conn.commit();
                }
            }
            // 批量执行最后一批数据并提交事务
            ps.executeBatch();
            conn.commit();
        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            try {
                if (ps != null) {
                    ps.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                System.out.println(e);
            }
        }
        Long end = System.currentTimeMillis();
        System.out.println("JDBC批量插入数据, 总耗时" + (end-begin) + "毫秒");
    }
}

执行时间:批量往数据库表中插入100w数据,大约花费4秒左右(在一张空表插入数据)

 

三)OracleJDBC数据库连接类

package com.oysept.utils;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * JDBC连接Oracle
 * @author ouyangjun
 */
public class OracleJDBC {
	
    /**
     * 获取Oracle数据库Connection
     * @return
     */
    public static Connection getConnection() {
        String driver = "oracle.jdbc.driver.OracleDriver"; // Oracle数据库驱动类
        String url = "jdbc:oracle:thin:@localhost:1521:ORCL"; // Oracle数据库连接url
        String user = "oysept"; // Oracle数据库登录账号
        String password = "oysept"; // Oracle数据库登录密码
        return getConnection(driver, url, user, password);
    }

    public static Connection getConnection(String driver, String url, String user, String password) {
        Connection conn = null;
        try {
            Class.forName(driver); // 加载数据库驱动
            conn = DriverManager.getConnection(url, user, password); // 获取数据库连接
        } catch (Exception e) {
            System.out.println(e);
        }
        return conn;
    }
}

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值