lishunli / nutz

Automatically exported from code.google.com/p/nutz
0 stars 0 forks source link

NutDao性能问题:关于批量操作,使用PreparedStatement的Batch功能 #192

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
  Update大量的数据时, 先Prepare一个INSERT语句再多次的执行, 
会导致很多次的
网络连接。要减少JDBC的调用次数改善性能, 
你可以使用PreparedStatement的
AddBatch()方法一次性发送多个查询给数据库. 例如, 
让我们来比较一下下面的例
子。

  例 1: 多次执行Prepared Statement

PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");

for (n = 0; n < 100; n++) {

ps.setString(name[n]);
ps.setLong(id[n]);
ps.setInt(salary[n]);
ps.executeUpdate();
}  

  例 2: 使用Batch

PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");

for (n = 0; n < 100; n++) {

ps.setString(name[n]);
ps.setLong(id[n]);
ps.setInt(salary[n]);
ps.addBatch();
}
ps.executeBatch();  

  在例 1中, 
PreparedStatement被用来多次执行INSERT语句。在这里, 执行了100
次INSERT操作, 
共有101次网络往返。其中,1次往返是预储statement, 
另外100次往返
执行每个迭代。在例2中, 
当在100次INSERT操作中使用addBatch()方法时, 只有两次
网络往返。1次往返是预储statement, 
另一次是执行batch命令。虽然Batch命令会用
到更多的数据库的CPU周期, 
但是通过减少网络往返,性能得到提高。记住, JDBC的性
能最大的增进是减少JDBC驱动与数据库之间的网络通讯。

Original issue reported on code.google.com by hzzd...@gmail.com on 18 May 2010 at 9:00

GoogleCodeExporter commented 9 years ago
支持

Original comment by main_...@yahoo.com.cn on 28 Apr 2011 at 12:55

GoogleCodeExporter commented 9 years ago
重构后的 Dao ,的 fastInsert 操作,将支持 batch

Original comment by zozoh...@gmail.com on 29 Apr 2011 at 1:28

GoogleCodeExporter commented 9 years ago
在新的Dao实现已经做到了

Original comment by wendal1985@gmail.com on 7 Jun 2011 at 11:03