String statusID[]=request.getParameterValues("StatusID");
db.setAutoCommit(false);
try{
    RoleTaskStatusFactory.delRoleTaskStatus(db, roleID);
    RoleTaskStatus roleTaskStatus=null;
    if(statusID!=null){
        for(int i=0;i<statusID.length;i++){
            roleTaskStatus=new RoleTaskStatus();
            roleTaskStatus.setRoleID(roleID);
            roleTaskStatus.setCustomFlag(1);
            roleTaskStatus.setTaskStatus(new TaskStatus(Integer.parseInt(statusID[i])));
            RoleTaskStatusFactory.insertRoleTaskStatus(db, roleTaskStatus);
         }
    }
db.commit();
}请看上面的代码,这是往数据表中一次插入多个状态,我是把状态ID放在一个数组里,然后循环往数据库里插入记录
每次都要roleTaskStatus=new RoleTaskStatus(); 创建新对象,然后insertRoleTaskStatus
如果有一万个状态,就要new一万次,和数据库交互一万次,太没有效率了
现在请问怎样优化这段代码?

解决方案 »

  1.   

    用我的想法做了,把数组转化为字符串,然后赋值给roleTaskStatus对象,然后在插入方法里,把字符串拆分,拼SQL,这样就只创建一个对性,一次插入,应该可以
      

  2.   

    用static修饰符啊,只初始化一次
      

  3.   

    设计决定了使用方式,也决定了效率。
    1 一个表不可能有上万的字段,所以你的假设不成立
    2 一个update可以更新多个字段,这个毋庸置疑
    3 你的方法为何不能是
      insertRoleTaskStatus(DB db,Set<roleTaskStatus>set);
    呢?这样至少你可以去拼装出来一个update进行更新,或者对应于一个对象的多个属性。
      

  4.   

    拼sql应该是最快的了,不过sql好像有长度限制,超出数据库sql缓存可能会发生问题。
    当然一万条应该问题不大。
    再不行就搞个存储过程。
      

  5.   

    你说的意思和说的拼sql是一个意思吧?
      

  6.   

    RoleTaskStatusFactory 增加一个addbatch方法,再增加一个excuteBatch方法。当然,如果statusId[] 长度较大的话,当for循环了一定次后,可以临时提交一次。
      

  7.   

    楼主既然不想用NEW 大可以只NEW 一个,在循环里面把他的值改变,然后UPDATE
      

  8.   

    我也不明白为什么一定要把new写在循环里面。
      

  9.   

    1. 将创建对象的代码移到循环外面, 同时将connection设置为静态2. 用批处理, 只连一次数据库即可. 
    stat.addBatch(sql);stat.executeBatch();