jdbc插入1000w条数据 批处理+事务

版权声明: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);
	    }
	}
}

测试用时:

优化:

其实这段代码还可以优化,就是用 连接池+多线程,可以看到我已经开辟了一个连接池,但是由于没时间所以没有继续优化。

猜你喜欢

转载自blog.csdn.net/qq_37618797/article/details/82806992
今日推荐