有这样一个方法,用于更新 接收到的list中的数据public void updatePersonalData(
List<EmployeeSalaryParameterRecord> employList) { if (!BlankUtil.isBlank(employList)) { for (EmployeeSalaryParameterRecord epr : employList) {
StringBuffer sql = new StringBuffer();
sql.append(" update SAL_VALUE set NUMERIC_VALUE =").append(
((NumericValue) epr.getParameterValue())
.getNumberValue().toString());
sql.append(" where SAL_VALUE_ID = ").append(
((NumericValue) epr.getParameterValue()).getId());
createSQLQuery(sql.toString()).executeUpdate();
}
}
}调用这个方法会有如下打印:17:51:42,825 DEBUG [SQL]  update SAL_VALUE set NUMERIC_VALUE =136.04 where SAL_VALUE_ID = 8683138
17:51:46,294 DEBUG [SQL]  update SAL_VALUE set NUMERIC_VALUE =136.04 where SAL_VALUE_ID = 8683144
17:51:49,871 DEBUG [SQL]  update SAL_VALUE set NUMERIC_VALUE =217.3 where SAL_VALUE_ID = 8683150
17:51:53,418 DEBUG [SQL]  update SAL_VALUE set NUMERIC_VALUE =113.64 where SAL_VALUE_ID = 8683163
17:51:57,120 DEBUG [SQL]  update SAL_VALUE set NUMERIC_VALUE =136.04 where SAL_VALUE_ID = 8683170
....
...
...
...
倘若这个list非常大时(譬如说5000条),这个执行率可想而知.请问有没有什么优化的办法.

解决方案 »

  1.   

    你更新的是不同id的不同value值呀--
    除了对没条数据的正常更新,没想到别的方法……
      

  2.   

    俺可怜的机器,从我发贴前5分钟开始跑..跑到现在还在running.....
      

  3.   

    sql语句这么简单还有可能优化吗?
      

  4.   

    可以用PreparedStatement批处理试试
      

  5.   

    思路:
    把自动提交设置为false;然后用批量处理一次处理 500条(如果是服务器的话可以是1000条) 也就是500条提交一次试试
      

  6.   

    问题已经解决了..
    自己想以了另外一种方法..试了一下,发现可以.
    public void updatePersonalData(
    List<EmployeeSalaryParameterRecord> employList) {
    StringBuffer sql = new StringBuffer();
    sql.append(" update SAL_VALUE set NUMERIC_VALUE =( case SAL_VALUE_ID");
    if (!BlankUtil.isBlank(employList)) { for (EmployeeSalaryParameterRecord epr : employList) {

    sql.append(" when ").append(((NumericValue) epr.getParameterValue()).getId()).append(" then ");
    sql.append(((NumericValue) epr.getParameterValue()).getNumberValue().toString());
    }
    sql.append(" else NUMERIC_VALUE end )");
    createSQLQuery(sql.toString()).executeUpdate();
    }
    }
      

  7.   

    已经贴代码出来了..以前这样循环来做,总是会产生多条update语句
    现在用一个更新语句来做.
     update 表名 set 目标列 = (case 条件列 when 条件1 then 值1 when 条件2 then 值2......
         else 目标列 end)这样相当于
      
          update 表名 set 目标列 = 值1 where 条件列=条件1
           update 表名 set 目标列 = 值2 where 条件列=条件2
      那个else 后面加上目标列,则会保持不满足条件的列的值不变. 这个是必须的,要不然其它不满足条件的列会置为null
      

  8.   

    对了.果子哥,上次问你的多层循环重构的办法..我自己想了一个,效率上高一点..但代码量会多一点点.
    比如说三层的for循环
    我先添加两层给他.
    然后用一个List(或数组)来保存,过滤后的数据.
    List list1=......
    for(....){
     for(....){
         list1.add(xxx);
      }
    }
    然后再对list1进行迭代.
      

  9.   

    请教一下哈,这样是不是增加的sql的复杂度啊
    >>俺可怜的机器,从我发贴前5分钟开始跑..跑到现在还在running.....
    多少条数据啊??
      

  10.   

    你觉得有增加SQL的复杂度吗?
    我觉得我衡量的标准是效率.而不是SQL语句的长短..几万条数据而已.
      

  11.   


    你没觉得很明显吗? 虽然是批处理,但是也要多次操作数据库,而我的方法只要与数据库打一次交道.觉得批处理就像select * from XXX limit xxx,xxx;就这样通过多次查出所有的数据.
    而我的就直接是select * from XXX.  我想批处理的效率和我这个方法的效率应该就像上面的这样.
      

  12.   

    update SAL_VALUE set NUMERIC_VALUE =136.04 where SAL_VALUE_ID in ('fff', 'yyy');
    归类一下 可能减少更新的SQL次数
      

  13.   

            conn = getMySqlConnection();    
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,    
                                        ResultSet.CONCUR_UPDATABLE);    
            conn.setAutoCommit(false);    
            stmt.addBatch("INSERT INTO survey(id, name) VALUES('11', 'Alex')");    
            stmt.addBatch("INSERT INTO survey(id, name) VALUES('22', 'Mary')");    
            stmt.addBatch("INSERT INTO survey(id, name) VALUES('33', 'Bob')");    
            int[] updateCounts = stmt.executeBatch();    
            System.out.println(updateCounts);    
            conn.commit();    
      

  14.   

    麻烦你看清楚题目..你这个是把所有的都设置成相同的值...
       再说list里面的.如果一万条纪录,值都不重复列?
      

  15.   


    lz 问你一下你 一万记录list没异出啊
      

  16.   

    我从excel中读取1W多记录放到对象中在放入list中 就内存异出了......
      

  17.   

    我Excel有2000多条数据. 每条数据有很多项..比如说:医疗保险啊,养老保险.失业保险....
     每个项在后台在组成一个新记录,保存到数据库中.
    也就是说,每条EXCEL的记录到后面以后会变成N条记录...没有报异常..  你报的是什么异常.?
      

  18.   

    不可能啊..list的容量,远不止1W.