有这样一个方法,用于更新 接收到的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条),这个执行率可想而知.请问有没有什么优化的办法.
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条),这个执行率可想而知.请问有没有什么优化的办法.
除了对没条数据的正常更新,没想到别的方法……
把自动提交设置为false;然后用批量处理一次处理 500条(如果是服务器的话可以是1000条) 也就是500条提交一次试试
自己想以了另外一种方法..试了一下,发现可以.
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();
}
}
现在用一个更新语句来做.
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
比如说三层的for循环
我先添加两层给他.
然后用一个List(或数组)来保存,过滤后的数据.
List list1=......
for(....){
for(....){
list1.add(xxx);
}
}
然后再对list1进行迭代.
>>俺可怜的机器,从我发贴前5分钟开始跑..跑到现在还在running.....
多少条数据啊??
我觉得我衡量的标准是效率.而不是SQL语句的长短..几万条数据而已.
你没觉得很明显吗? 虽然是批处理,但是也要多次操作数据库,而我的方法只要与数据库打一次交道.觉得批处理就像select * from XXX limit xxx,xxx;就这样通过多次查出所有的数据.
而我的就直接是select * from XXX. 我想批处理的效率和我这个方法的效率应该就像上面的这样.
归类一下 可能减少更新的SQL次数
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();
再说list里面的.如果一万条纪录,值都不重复列?
lz 问你一下你 一万记录list没异出啊
每个项在后台在组成一个新记录,保存到数据库中.
也就是说,每条EXCEL的记录到后面以后会变成N条记录...没有报异常.. 你报的是什么异常.?