我有一个名为Person
的表,我的选择sql通常会带来10万人的数量,因为它花费了太多时间,我遇到了readtimeout异常。
所以我知道我必须使用 ROWNUM
来限制结果大小。
Class MyService {
@Transactional(rollbackFor = Exception.class)
doJob(){
jobService.process();
}
}
Class JobService {
public void process() {
List<Person> personlList= jdbcQuery.query ("Select * from ... ... where rownum<1000" , ROWMAPPAR, parameter);
//Process all record list
}
在知道之前一切都很好,但我想确保所有记录(比如 100K)都已处理,如果在处理其中一个批处理时出现错误,则应发生回滚。
我需要递归调用process()
方法吗?
使用 Spring 3.5 Oracle 11g
最佳答案
使用查询中所示的 ROWNUM 很可能不会给您带来预期的结果。 (但另一方面,至少有时可能是这样:-)。 ROWNUM 是在从查询发出行时生成的,AFTER WHERE 子句被求值,但 BEFORE 任何 ORDER BY 或 HAVING 子句都被应用。这可能会导致您的查询返回可能令您惊讶的结果。
尝试创建下表:
create table t(n number);
并填充它:
insert into t (n)
select n from
(select rownum n from dual connect by level <= 2000)
where n > 1234;
因此,该表将包含值从 1235 到 2000 的行。
按顺序运行以下每个查询:
select *
from t
order by n;
select n, rownum
from t
where rownum < 100
order by n;
select n, rownum as r from
(select n
from t
order by n);
select n, r from
(select n, rownum as r from
(select n
from t
order by n))
where r < 100
order by n;
并观察得到的输出的差异。
对于那些手边没有 Oracle 实例的人,here's an SQLFiddle with the above in it .
分享并享受。
关于java - 事务方法的递归 ROWNUM 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670241/