多谢帮助,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();
}
}

解决方案 »

  1.   

    PreparedStatement
    我试验过了,而且我看不出来是什么问题,但是和Statement没有区别的。
      

  2.   

    哦,我的是Win32的MySQL。你这段代码不需要优化了,挺好的。
      

  3.   

    你的任务目标比较简单,代码这些写应该差不多了。
    细节上有几个地方你要注意:
    1、如果整个表的操作要确保是一个完整的事务,那么可以这样。如果不需要保证是一个完整的事务,那么我认为把批处理做成1000-3000/每次,分次提交比较好。理由很简单:虽然会增加操作的时间,但减少了每次事务的时间。
    2、记得把pstmt关闭
      

  4.   

    还有几点不明白的:int end = (num<=BATCH)?num:BATCH;
    这一句是啥意思,没看懂?另外,“批量更新”体现在哪几个语句,pstmtUpdate.addBatch(); 吗,可是它放在while(rs.next())语句里面,不是仍然是逐条更新吗?比如我表里有20000条记录,全部都进行操作,但分批每次3000条,在哪里设置?
      

  5.   

    int end = (num<=BATCH)?num:BATCH;
    是end取值为num和BATCH较小的那个
      

  6.   

    我在昨天给你的代码中有2个变量,begin,end,它们作为参数放到SQL中,是行号范围。
    昨天我写给你的是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();
    }
      

  7.   

    也就是说addBatch()是先把值设置好,而executeBatch()是更新对吗?我的java API手册里面居然没有这两个方法,弄的我都不知道有这个用法,不知道是不是版本太老了。
      

  8.   

    pczhouji(挪威的森林):
    你说得对,“addBatch()是先把值设置好,而executeBatch()是更新”嘻嘻,你是什么API手册啊?快更新吧
      

  9.   

    嗯,是的!这个问题圆满解决了,而且长了不少见识,呵呵。此贴特为答谢hbwhwang而开,其他顶贴的朋友不好意思了。