版权声明:https://blog.csdn.net/qq_37618797 https://blog.csdn.net/qq_37618797/article/details/82806992
我们以这么一个表为例子,向这张表中插入1000w条数据
package com.ck.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Random;
/**思路**/
//1、变多次提交为一次
//2、使用批量操作
/**
* 插入1000W条数据
* @author sansheng__
* @version 1.0
* @date 2018年9月15日 下午4:43:31
* @copyright 三生__
*/
public class InsertBigData2 {
public static void main(String[] args) throws SQLException {
long startTime = System.currentTimeMillis();
//1、使用连接池建立数据库连接
MyDataSource dataSource = new MyDataSource();
//2、获得连接
Connection con = dataSource.getConnection();
con.setAutoCommit(false); //设置自动提交为false
//3、建立SQL语句
String sql = "insert into student1 values(?,?,?,?,?,?)";
//4、建立sql对象
PreparedStatement ps = con.prepareStatement(sql);
//5、插入数据
for(int i = 0; i < 1000; i++){
ps.clearBatch();
//一次性提交1W条
for(int j = 0; j < 10000; j++){
ps.setString(1,"2016"+j);
ps.setString(2,"张"+j);
ps.setString(3,"张"+j);
ps.setString(4,new Random().nextInt(30)+"");
ps.setString(5,"2016届软件"+new Random().nextInt(20)+"班");
ps.setString(6,"1777343"+j);
ps.addBatch();
}
//批处理
ps.executeBatch();
//提交
con.commit();
}
con.commit();
//6、归还数据库连接给连接池并关闭连接
ps.close();
dataSource.releaseConnection(con);
//7、输出时间
long endTime = System.currentTimeMillis();
System.out.println("耗时:" + (endTime - startTime));
}
/*----------------------------------连接池---------------------------------------*/
public static class MyDataSource{
//链表 --- 实现栈结构
private LinkedList<Connection> dataSources = new LinkedList<Connection>();
//初始化连接数量
MyDataSource() {
//一次性创建10个连接
for(int i = 0; i < 10; i++) {
try {
//1、装载驱动对象
Class.forName("oracle.jdbc.OracleDriver");
//2、通过JDBC建立数据库连接
Connection con =DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","a");
//3、将连接加入连接池中
dataSources.add(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Connection getConnection() throws SQLException {
//取出连接池中一个连接
final Connection conn = dataSources.removeFirst(); // 删除第一个连接返回
return conn;
}
//将连接放回连接池
public void releaseConnection(Connection conn) {
dataSources.add(conn);
}
}
}
测试用时:
优化:
其实这段代码还可以优化,就是用 连接池+多线程,可以看到我已经开辟了一个连接池,但是由于没时间所以没有继续优化。