程序没问题,建议如下:1、将batch数改大,改成1000试试
2、给planid字段和phonenum字段建索引

解决方案 »

  1.   

    if(   i   %   60   ==   0){ 
                                                                            //每60条打包发送 
    //         ps.executeBatch(); 
        } 
                    } 
    ps.executeBatch(); -------------------------------------
    if(   i   %   60   ==   0){ 
                                                                            //每60条打包发送 
             ps.executeBatch(); 
        } 
                    } 
    //ps.executeBatch(); 没有进行批处理啊,都是一条条的处理
      

  2.   

    还有在for循环外要加一句刷新:
    ps.executeBatch();   
      

  3.   

    之前发贴时忘记把注释取消了。
    是:
    if(       i       %       60       ==       0){   
                                                                                                                                                    //每60条打包发送   
                      ps.executeBatch();   
            }   
                                    }   
    ps.executeBatch();   
    也就是60条打包。速度奇慢
      

  4.   

    第一 建议在ps.addBatch();后添加ps.clearParameters();
    第二 我PreparedStatement对象在执行过ps.executeBatch();之后会清空批量池里的语句么?如果不会那conn.commit();前的那句ps.executeBatch(); 其实相当于又把所有语句执行了一遍(因为之前的还都在里面都没施放)
    建议这样
    if(   i   %   60   ==   0){
              //每60条打包发送
             ps.executeBatch();
             ps.clearBatch();
        }
    试下也许能有用
      

  5.   

    感觉不加ps.clearBatch();的话 如果有130条要更新
    if(   i   %   60   ==   0){
       //每60条打包发送
       ps.executeBatch();
    }
    那到第60条记录的时候是更新了第1条至60条记录 而到第120条记录的时候是更新了第1条至第120条
    而之后的               
    ps.executeBatch(); //这句其实是更新了第1条至第130条
    conn.commit(); 
    看出问题了么?重复更新了很多次 当然这只是我个人感觉不一定全对 你再仔细思考一下
      

  6.   

    感觉不加ps.clearBatch();的话   如果有130条要更新
    if(i%60 == 0){
          //每60条打包发送
          ps.executeBatch();
    }
    那到第60条记录的时候if第一次成立批量更新了第1条至60条记录   
    而到第120条记录的时候if第二次成立更新了第1条至第120条 并不是61至120条
    而之后的                              
    ps.executeBatch();   //这句其实是更新了第1条至第130条 并不是121至130条
    conn.commit();  
    看出问题了么?重复更新了很多次  肯定会很慢 当然这只是我个人感觉不一定全对   你再仔细思考一下第一 建议在ps.addBatch();后添加ps.clearParameters();
    第二 建议这样
    if(i%60 == 0){
        //每60条打包发送
        ps.executeBatch();
        ps.clearBatch();
    }  
      

  7.   

    好。非常谢谢你的详细解答。
    最后这个语句ps.executeBatch();不加也行。因为commit时它会执行。
    主要问题在小循环中。就是每60条更新时速度比较慢。
    因为我在if( i%60 == 0)就打印语句。每更新60条提示一次。感觉很慢。1-60条时也不快。
    如果按照你所说的。1-60理应是最快的。然后依次变慢。但现在情况不是这样。
    我的思路是这样的。应为更新数量比较多。所以每次我都把sql语句都先添加等累计到一定数量
    如每60条就执行,主要的代码如下:ps   =   conn.prepareStatement(sql); 
    for(int   i   =   0;i <list.size();i++){ 
        ps.setInt(1,0L); 
        ps.setLong(2,phonenum); 
        ps.addBatch();     if(   i   %   60   ==   0){ 
                                                                            //每60条打包发送 
             ps.executeBatch(); 
        } 

    ps.executeBatch(); 
    conn.commit();这个思路,跟代码是否有错误?如果没,那为什么执行速度慢? 
      

  8.   

    这个怎么说好呢 你感觉怎么样才算达到你的要求感觉不慢呢?可能用JDBC的话也就只能这样了 毕竟没法和直接在服务器的数据库上运行相比
    我个人感觉如果只有60条的话这程序应该是没问题 只是那句SQL里的planid='"+planid+"' 也可以换成planid=?然后将也在下面用ps.setString(2,planid);就行 其实你在程序里已经写了 但我不明白为什么要注释掉 而且如果是主贴那样写的话ps.setLong(3,phonenum);也应该是ps.setLong(2,phonenum);才对
    我还是建议在if里加上ps.clearBatch();这句试一下 最起码这样写对于大于60条的更新应该是有好处的