JDBC批量增加数据

                            JDBC批量增加数据
对于数据库的操作,之前我的博客有通用的增删改查操作,除此之外,许多数据库都要求批量操作.
不过对于删改查操作来说,之前介绍的方法就自带批量的意思.主要这次来分享一下批量增加.
一般对于批量操作,我们还是会想到用PreparedStatement来进行操作.
第一种方法:
long start = System.currentTimeMillis(); 
Connection conn = JDBCUtils.getConnection(); 
String sql = "insert into goods(name)values(?)"; 
PreparedStatement ps = conn.prepareStatement(sql); 
for(int i = 1;i <= 20000;i++){ 
ps.setString(1, "name_" + i); 
ps.executeUpdate(); 
}
long end = System.currentTimeMillis(); 
System.out.println("花费的时间为:" + (end - start));
JDBCUtils.closeResource(conn, ps);

这种方法虽然直白简单,但速度稍微慢了些,采用一些方法将他改进.和I/O流中的read()和read(byte[])的速度改进一样.

修改1: 使用 addBatch() / executeBatch() / clearBatch() 
修改2:mysql服务器默认是关闭批处理的,我们需要通过一个参数,
让mysql开启批处理的支持。 ?rewriteBatchedStatements=true 写在配置文件的url后面 
修改3:使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar
public void testInsert1() throws Exception{ 
		long start = System.currentTimeMillis(); 
		Connection conn = JDBCUtils.getConnection(); 
		String sql = "insert into goods(name)values(?)"; 
		PreparedStatement ps = conn.prepareStatement(sql); 
		for(int i = 1;i <= 1000000;i++){
	 		ps.setString(1, "name_" + i); //1.“攒”sql ps.addBatch(); 
	 		if(i % 500 == 0){
	  		//2.执行 
	  		 ps.executeBatch();
	  	 	//3.清空 
	  		 ps.clearBatch(); 
	  		} 
		}	
		long end = System.currentTimeMillis(); 
		System.out.println("花费的时间为:" + (end - start));
		//20000条:625 
		//1000000条:14733 
		JDBCUtils.closeResource(conn, ps); 
}

由于数据在存储时是采用一条条的存的方式,所以速度仍然有进步的空间,所以我们采用让数据一次存入的方法可以大大提升速度:
下面展示一些 内联代码片

最终版
层次四:在方法二的基础上操作 
使用Connection 的 setAutoCommit(false) / commit()
public void testInsert2() throws Exception{ 
		long start = System.currentTimeMillis(); 
		Connection conn = JDBCUtils.getConnection(); 
		//1.设置为不自动提交数据 
		conn.setAutoCommit(false); 
		String sql = "insert into goods(name)values(?)"; 
		PreparedStatement ps = conn.prepareStatement(sql); 
		for(int i = 1;i <= 1000000;i++){ 
			ps.setString(1, "name_" + i); 
			//1.“攒”sql 
			ps.addBatch();
			if(i % 500 == 0){
			 	//2.执行
			  	ps.executeBatch(); 
			  	//3.清空 
			  	ps.clearBatch(); 
			 } 
		}
		//2.提交数据 
		conn.commit(); 
		long end = System.currentTimeMillis(); 
		System.out.println("花费的时间为:" + (end - start));
		//1000000条:4978 
		JDBCUtils.closeResource(conn, ps); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值