dbc批量插入、批量删除、批量更新
(2010-06-02 16:25:03) 标签: it |
一、JDBC的批量插入
} catch (SQLException ex) {
} catch (ClassNotFoundException ex) {
}
说明下在建Statement的时候,后面两个参数的意义:
第一个参数指定 ResultSet 的类型。其选项有:
TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。
第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有:
CONCUR_READ_ONLY:这是缺省值,指定不可以更新
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet
方法二 使用Statement加批量的方法
Java代码
stmt.executeBatch();
conn.commit();
方法三:直接使用Statement
Java代码
conn.setAutoCommit(false);
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
for(int x = 0; x < size; x++){
}
conn.commit();
使用上述方法分别插入10万条数据的平均测试时间为:
方法一:17.844s
方法二:18.421s
方法三:16.359s
可以看出JDBC的batch语句插入不但没有性能提升,反而比没有用batch的时候要慢,当然这可能跟JDBC具体驱动的实现方法有关。 附件中是我测试代码,可以用来在自己电脑上跑一下。
在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。
Java代码
conn.setAutoCommit(false)
二、JDBC的批量更新
//conn是Connection的类型
//若a为true则意味着该数据是支持批量更新的
boolean a=dbmd.supportsBatchUpdates();
这个又是一种方法批量进行更新。但是我认为上面那个方法不错
三、JDBC批量删除
String sql="delete from table where id in(0";
String id[]=要删除的ID数组;
for(int i=0;i <id.length;i++)
{
}
sql+=")";
PreparedStatement ps=conn.prepareStatement(sql);
ps.execute();
-
public void deleteBat(Integer[] catNo){ - try
{ -
Connection con=DBUtil.getInstance().getCon(); -
String sql="delete from cat where catno=?"; -
con.setAutoCommit(false); -
PreparedStatement ps=con.prepareStatement(sql); -
for (Integer in : catNo) { -
ps.setInt(1, in); -
ps.addBatch(); -
} -
int[] result=ps.executeBatch(); -
con.commit(); -
for (int i : result) { -
System.out.println(i); -
} - }
catch (ClassNotFoundException e) { -
e.printStackTrace(); - }
catch (SQLException e) { -
e.printStackTrace(); - }