批量操作一般都会有,这里也分享一下我的经验:
用的早期的: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倍左右。有些细节我也没注意了。