mysql 批量操作

批量操作一般都会有,这里也分享一下我的经验:

用的早期的:mysql-connector-java-5.0.7-bin.jar

关于连接代码看:http://greemranqq.iteye.com/admin/blogs/1830200

这里我发现的问题是:

1.将自动提交设置成false, 不然批量操作会失去效果

2.网上说:jdbc.url = jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

   这只成true,才有批量效果。我设置成false 和true 都没什么影响

   求同志们多指导,详细原因不了解

数据库层的操作:

扫描二维码关注公众号,回复: 1311758 查看本文章
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DaoUtil {
	private static Connection conn;
	// 批量插入语句
	static String batchSql = "insert into newtable values(?,?)";

	// 普通插入大量数据
	public static void insertBatch1(String batchSql) {
		conn = ConnectionUtil.getConnection();
		try {
			PreparedStatement ps = conn.prepareStatement(batchSql);
			for (int i = 0; i < 10000; i++) {
				ps.setInt(1, i);
				ps.setString(2, "name");
				ps.addBatch();
			}
			ps.executeBatch();
		} catch (SQLException e) {
			ConnectionUtil.rollback(conn);
			e.printStackTrace();
		}finally{
			ConnectionUtil.colse(conn);
		}
	}

	// 批量插入
	public static void insertBatch2(String batchSql) {
		conn = ConnectionUtil.getConnection();
		try {
			// 自动提交默认是true,就会按条执行,执行效率没有优化
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(batchSql);
			for (int i = 0; i < 10000; i++) {
				ps.setInt(1, i);
				ps.setString(2, "name");
				ps.addBatch();
			}
			ps.executeBatch();
			conn.commit();
		} catch (SQLException e) {
			ConnectionUtil.rollback(conn);
			e.printStackTrace();
		}finally{
			ConnectionUtil.colse(conn);
		}
	}
	
	public static void main(String[] args) {
//		long begin1 = System.currentTimeMillis();
//		insertBatch1(batchSql);
//		long end1 = System.currentTimeMillis();
//		System.out.println("普通插入10000条数据时间:"+(end1-begin1));
		
		long begin2 = System.currentTimeMillis();
		insertBatch2(batchSql);
		long end2 = System.currentTimeMillis();
		System.out.println("批量插入10000条数据时间:"+(end2-begin2));
	}
}

这里 的简单记录,大概效率是10倍左右。有些细节我也没注意了。

猜你喜欢

转载自greemranqq.iteye.com/blog/1830212