java - 事务方法的递归 ROWNUM 使用

标签 java spring oracle

我有一个名为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/

相关文章:

java - 如何在java中不向server.log抛出异常

java - 如何在hibernate中编写具有超过2个表的连接的POJO

oracle - 将Joda DateTime映射到Grails中的Oracle Timestamp

java - 在最大消息长度 : 2048 with payload-deserializing-transformer 之前未找到 CRLF

mysql - 错误消息 "ORA-02270: no matching unique or primary key for this column-list"

sql - 物化 View 中的动态计算

java - 如何在 Play Framework 项目中使用相对路径访问资源文件?

java - JUnit 5 : Specify execution order for nested tests

java - Spring AMQP : Send reply from POJO listener failure because of missing reply-to property

java - 从 pojo 或 singleton 等非组件类读取 application.properties