日期:2014-05-16  浏览次数:20516 次

jdbc批量插入数据库

jdbc批量插入数据库
翻译:陈先波(turbochen@163.com)
阅读原文:http://www.theserverside.com/articles/article.tss?l=JDBCPerformance_PartIII

一、使用Statement而不是PreparedStatement对象
JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们. 对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的.

PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行. 例如, 假设我使用Employee ID, 使用prepared的方式来执行一个针对Employee表的查询. JDBC驱动会发送一个网络请求到数据解析和优化这个查询. 而执行时会产生另一个网络请求. 在JDBC驱动中,减少网络通讯是最终的目的. 如果我的程序在运行期间只需要一次请求, 那么就使用Statement. 对于Statement, 同一个查询只会产生一次网络到数据库的通讯.

对于使用PreparedStatement池的情况下, 本指导原则有点复杂. 当使用PreparedStatement池时, 如果一个查询很特殊, 并且不太会再次执行到, 那么可以使用Statement. 如果一个查询很少会被执行,但连接池中的Statement池可能被再次执行, 那么请使用PreparedStatement. 在不是Statement池的同样情况下, 请使用Statement.

二、使用PreparedStatement的Batch功能
Update大量的数据时, 先Prepare一个INSERT语句再多次的执行, 会导致很多次的网络连接. 要减少JDBC的调用次数改善性能, 你可以使用PreparedStatement的AddBatch()方法一次性发送多个查询给数据库. 例如, 让我们来比较一下下面的例子.
例 1: 多次执行Prepared Statement
?
  1. PreparedStatement?ps?=?conn.prepareStatement(??
  2. ???"INSERT?into?employees?values?(?,??,??)"?);??
  3. ??
  4. for??(n?=??0?;?n?<??100?;?n++)?{??
  5. ??
  6. ??ps.setString(name[n]);??
  7. ??ps.setLong(id[n]);??
  8. ??ps.setInt(salary[n]);??
  9. ??ps.executeUpdate();??
  10. }??
例 2: 使用Batch
?
  1. PreparedStatement?ps?=?conn.prepareStatement(??
  2. ???"INSERT?into?employees?values?(?,??,??)"?);??
  3. ??
  4. for??(n?=??0?;?n?<??100?;?n++)?{??