JDBC批处理使用起来要小心

看下面的方法
Connection conn = getConnection();
PreparedStatement ps = null;
try {
conn.setAutoCommit(false);
ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
Random r = new Random();
for(int i = 0; i < 1000; i++){
ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
ps.setString(2, String.valueOf(r.nextInt()));
ps.executeUpdate();
[color=red]conn.commit(); //每次都提交[/color]
}

} catch (SQLException e) {
conn.rollback();
throw e;
}finally{
ps.close();
conn.close();
}

循环每次都开启一个事务 插入一千条数据 耗时 29078 ms
Connection conn = getConnection();
PreparedStatement ps = null;
try {
conn.setAutoCommit(false);
ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
Random r = new Random();
for(int i = 0; i < 1000; i++){
ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
ps.setString(2, String.valueOf(r.nextInt()));
ps.executeUpdate();

}
conn.commit(); //只提交一次
} catch (SQLException e) {
conn.rollback();
throw e;
}finally{
ps.close();
conn.close();
}

只开启一次事务 耗时 703 ms
但这不是推荐用法,jdbc有一个批处理方法 专门处理这种批量操作的 ps.addBatch();

Connection conn = getConnection();
PreparedStatement ps = null;
try {
conn.setAutoCommit(false);
ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
Random r = new Random();
for(int i = 0; i < 1000; i++){
ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
ps.setString(2, String.valueOf(r.nextInt()));
ps.addBatch();//加入批处理
//ps.executeUpdate();不能与addBatch()同时用

}
int[] results = ps.executeBatch();//执行批处理
conn.commit();
} catch (SQLException e) {
conn.rollback();
throw e;
}finally{
ps.close();
conn.close();
}


批处理方式 耗时 781 ms

跟只开启一次事务效率差不多

这里要着重指出addBatch()和executeUpdate()不要同时用否则会导致记录插入两次
本来1000条记录 会插入2000条,本人在开始就翻了这个错误

第一种方法与第二 三种方法性能差别达 40倍 看来事务真是性能杀手啊 能少开尽量少开啦
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值