多谢帮助,100分奉上!另外贴出修改后的完整代码,你看还能优化否?
(原先有传入一个参数num,现在去掉了,因为现在不需要限定前N行了,而是对所有记录进行操作,所以我注释掉了部分代码)
public void makeoutStr()
{
String inStr = null;
String outStr = null;
String sqlSelect = "SELECT IN_STR FROM TBL_STR";
String sqlUpdate = "UPDATE TBL_STR SET OUT_STR=? WHERE IN_STR=?";
PreparedStatement pstmtSelect = null;
PreparedStatement pstmtUpdate = null;
ResultSet rs = null;
int i = 1;
//final int BATCH = 10000
//int begin = 1;
//int end = (num<=BATCH)?num:BATCH;
try
{
pstmtSelect = con.prepareStatement(sqlSelect);
pstmtUpdate = con.prepareStatement(sqlUpdate); //pstmtSelect.setInt(1,begin);
//pstmtSelect.setInt(2,end);
rs = pstmtSelect.executeQuery();
while (rs.next())
{
System.out.println("i="+i);
inStr = rs.getString("IN_STR"); //取出
System.out.println("inStr:" + inStr);
outStr = MakeOut.makeOut(inStr); //转换,调用另一个类的方法
System.out.println("outStr:" + outStr);
pstmtUpdate.setString(1, outStr);
pstmtUpdate.setString(2, inStr);
pstmtUpdate.addBatch(); //插入
i++;
}
rs.close();
pstmtUpdate.executeBatch(); //begin+=BATCH;
//end=(end+BATCH<=num)?(end+BATCH):num;
}
catch (Exception e)
{
e.printStackTrace();
}
}
(原先有传入一个参数num,现在去掉了,因为现在不需要限定前N行了,而是对所有记录进行操作,所以我注释掉了部分代码)
public void makeoutStr()
{
String inStr = null;
String outStr = null;
String sqlSelect = "SELECT IN_STR FROM TBL_STR";
String sqlUpdate = "UPDATE TBL_STR SET OUT_STR=? WHERE IN_STR=?";
PreparedStatement pstmtSelect = null;
PreparedStatement pstmtUpdate = null;
ResultSet rs = null;
int i = 1;
//final int BATCH = 10000
//int begin = 1;
//int end = (num<=BATCH)?num:BATCH;
try
{
pstmtSelect = con.prepareStatement(sqlSelect);
pstmtUpdate = con.prepareStatement(sqlUpdate); //pstmtSelect.setInt(1,begin);
//pstmtSelect.setInt(2,end);
rs = pstmtSelect.executeQuery();
while (rs.next())
{
System.out.println("i="+i);
inStr = rs.getString("IN_STR"); //取出
System.out.println("inStr:" + inStr);
outStr = MakeOut.makeOut(inStr); //转换,调用另一个类的方法
System.out.println("outStr:" + outStr);
pstmtUpdate.setString(1, outStr);
pstmtUpdate.setString(2, inStr);
pstmtUpdate.addBatch(); //插入
i++;
}
rs.close();
pstmtUpdate.executeBatch(); //begin+=BATCH;
//end=(end+BATCH<=num)?(end+BATCH):num;
}
catch (Exception e)
{
e.printStackTrace();
}
}
我试验过了,而且我看不出来是什么问题,但是和Statement没有区别的。
细节上有几个地方你要注意:
1、如果整个表的操作要确保是一个完整的事务,那么可以这样。如果不需要保证是一个完整的事务,那么我认为把批处理做成1000-3000/每次,分次提交比较好。理由很简单:虽然会增加操作的时间,但减少了每次事务的时间。
2、记得把pstmt关闭
这一句是啥意思,没看懂?另外,“批量更新”体现在哪几个语句,pstmtUpdate.addBatch(); 吗,可是它放在while(rs.next())语句里面,不是仍然是逐条更新吗?比如我表里有20000条记录,全部都进行操作,但分批每次3000条,在哪里设置?
是end取值为num和BATCH较小的那个
昨天我写给你的是10000行一批。第一次,begin=1,end=10000。然后每次都加10000,直到最后。end变量的控制,你得有个数啊,比如总共才5000行,你搞个1-10000,就不好了吧。因此用
int end = (num<=BATCH)?num:BATCH;
相当于:
if (num<=BATCH)
end=num;
else
end=BATCH;至于3000行每批,你可以在你的i++;后面加上:
i++;
if (i%3000==0){
pstmtUpdate.executeBatch();
con.commit();
}
你说得对,“addBatch()是先把值设置好,而executeBatch()是更新”嘻嘻,你是什么API手册啊?快更新吧