Mysql数据库批处理操作调优

1.实验目标

 探索在Java通过JDBC方式连接Mysql数据库的情况下,如何最快地进行批量插入、修改操作?

2.实验步骤

 这里主要记录探索批量插入的调优过程,批量删除或删除操作类似。本实验主要包含两大步骤:1)编写实验代码2)修改数据记录条数、单条插入语句包含的数据条数、每次批处理的提交量。本次实验中用到的People数据表,仅包含1个int数据项num,实验中插入的数据无具体物理意义。

 实验代码如下所示:

	public void batchInsert(Connection conn) {
		String str = "insert into People(num) values";
		int record = 100000,lenForEvery =15;// record是数据记录条数,lenForEvery是每条插入语句包含的记录条数
		int commitLen = 5000;// 每次批处理提交的记录条数
		for(int i=0;i<lenForEvery;i++) {// 形成一个insert的sql语句
			str+="(?)";
			if(i<lenForEvery-1) str+=",";
			else str+=";";
		}
		boolean autoCommit  = false;
		try {
			autoCommit = conn.getAutoCommit();
			conn.setAutoCommit(false);
			PreparedStatement ps =  conn.prepareStatement(str);
			int i = 0;
			int count = 0;
			int tempRecord = (record/lenForEvery)*lenForEvery;
			while(i<tempRecord) {
				int j = 1;
				while(j<=lenForEvery&&i<tempRecord) {
					ps.setInt(j, i);
					j++;
					i++;
					count++;
				}
				ps.addBatch();
				if(count>=commitLen||i==tempRecord) {
					count = 0;
					ps.executeBatch();
					conn.commit();
					ps.clearBatch();
				}
			}
			// 将剩余不足lenForEvery的记录进行存储
			ps.close();// 将之前的PreparedStatement进行关闭
			str = "insert into People(num) values(?)";
			ps  = conn.prepareStatement(str);
			while(i<record) {
				ps.setInt(1, i++);
				ps.addBatch();
			}
			ps.executeBatch();
			conn.commit();
			ps.clearBatch();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				conn.rollback();// 注意这里有可能存在一旦出错,无法全部回滚的问题
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally {
			try {
				conn.setAutoCommit(autoCommit);
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}


3.实验结果


4.实验结论

   本文中采用的是PreparedStatement语句进行,主要是因为测试的是同一种类型的操作。从以上数据我们可以得出如下结论:

1)当存在大量的插入或修改操作需求时应尽量使用批处理操作

2)当待批量操作的SQL语句是同一种类型,如插入或删除时,建议使用PreparedStatement进行批量操作;若包含多种类型,建议使用Statement语句进行批量操作。

3)当待批量操作的SQL语句是insert语句时,可考虑在同一个SQL语句插入多条记录,一般以一次插入15~20条语句最为适合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值