一)单条插入
原理:用一个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;
}
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!