说明:环境为eclipse + jdk1.7
所需jar包:ojdbc6-11.2.0.1.0.jar
亮点:使用PreparedStatement + addBatch()方法(实现了秒级的插入速度)
1、变多次提交为一次
2、使用批量操作
批处理就是将一批一批SQL语句的处理,而不是一条一条语句进行处理。如当你有多条SQL语句要执行时,一次向服务器发送一条语句,这样虽然也可以达到效果,但是效率很差,而处理这个问题就可以使用批处理(即是一次向服务器发送多条SQL语句,然后让服务器一次性处理),批处理只针对更新语句(新增、删除、修改),所有批处理跟查询没有关系。
批处理:如通过多次调用PreparedStatement类的addBatch()方法把所有需要执行的SQL语句添加到“批”中,然后调用PreparedStatement的executeBatch()方法来执行当前“批”中的语句。
代码展示:
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
final String url = "jdbc:oracle:thin:@localhost:1521:XXX";
final String driverClassName = "oracle.jdbc.driver.OracleDriver";
final String user = "root";
final String password = "123456";
Class.forName(driverClassName);
Connection conn = null;
conn = DriverManager.getConnection(url, user, password);
if (conn != null ) {
System.out.println( "获取连接成功" );
// 获取连接成功,调用插入方法
insert(conn);
} else {
System.out.println( "获取连接失败" );
}
}
/**
* 实际执行插入数据的方法
* @param conn
*/
public static void insert(Connection conn) {
try {
// 设置事务的提交方式为手动提交
conn.setAutoCommit(false);
String sql = "insert into table_name(字段1, 字段2, 字段3, 字段4) values(?, ?, ?, ?)";
PreparedStatement pstm = conn.prepareStatement(sql);
// 向数据库表table_name中批量插入1千万条数据
for (int i = 1; i <= 10000000; i++) {
pstm.setString(1, "XXX"); // 为第一个字段赋值(即:替换第一个问号的值)
pstm.setString(2, "XXX"); // 为第二个字段赋值(即:替换第二个问号的值)
pstm.setString(3, "XXX"); // 为第三个字段赋值(即:替换第三个问号的值)
pstm.setString(4, "XXX"); // 为第四个字段赋值(即:替换第四个问号的值)
pstm.addBatch(); // 添加
// 设置每5000条sql语句提交一次事务(说明,5000这个值不是固定的,根据实际情况来设置,值不同,插入的效率也不同,需经过测试才能获取最合适的值)
if (i % 5000 == 0) {
pstm.executeBatch(); // 执行
pstm.clearBatch(); // 清空
conn.commit(); // 手动提交事务
}
}
pstm.executeBatch(); // 执行
pstm.clearBatch(); // 清空
conn.commit(); // 手动提交事务
// 调用释放资源的方法
close(pstm, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 释放资源的方法
* @param pstm
* @param conn
*/
public static void close(PreparedStatement pstm, Connection conn) {
try {
if (pstm != null) {
pstm.close();
}
if (conn != null) {
conn.close();
}
System.out.println("连接关闭,程序结束!");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("连接关闭失败");
}
}
}