代码之家  ›  专栏  ›  技术社区  ›  Codek

如何在JDBC数据源级别限制从Oracle返回的行数?

  •  4
  • Codek  · 技术社区  · 16 年前

    看来 maxRows 仅当您在Java代码中的数据源上设置它时才可用。放 maxRows="2"

    是否有其他方法限制返回的行?没有代码更改?

    6 回复  |  直到 12 年前
        1
  •  4
  •   carson    16 年前

    它不是在配置级别可用的东西。您可能需要再次检查它是否执行了您希望它执行的操作: see the javadoc for setMaxRows . 对于Oracle,它仍然会为查询返回每一行,然后只删除范围之外的行。您确实需要使用rownum使其与Oracle配合良好,但在配置中也无法做到这一点。

        2
  •  1
  •   reallyinsane    16 年前

    问题是为什么要限制返回的行数。这样做可能有很多原因。第一种方法是限制数据库返回的数据。在我看来,这在大多数情况下没有任何意义,因为如果我只想获得某些数据,那么我将使用不同的语句或添加过滤条件或其他内容。例如,如果您使用Oracle的rownum,您不知道哪些数据在您获得的行中,哪些数据不包括在内,因为您只是告诉数据库您想要从x行到y行。
    Statement.setFetchSize() . 如果将结果集中的光标移动到超过获取的行数,JDBC驱动程序将从数据库中获取缺少的数据。(对于Oracle,数据库将把数据存储在一个ref游标中,该游标由JDBC驱动程序直接访问)。

        3
  •  1
  •   Chucky    13 年前

    * 注意:下面的代码纯粹是作为示例提供的。没有 被测试* 在脸上。

    如果您希望避免修改SQL查询,但仍然希望有干净的代码(这意味着您的代码保持可维护性),那么可以使用包装器设计解决方案。也就是说,通过使用一小组封装现有类的类,您可以无缝地为应用程序的其余部分实现所需的功能,这些应用程序仍然认为它在使用真实的数据源、连接和语句。

    2-再编写一个包装器:ConnectionWrapper,它包装一个连接,该连接在createStatement()中返回StatementWrapper,在prepareStatement()中返回PreparedStatementWrapper。这些是以前以ConnectionWrapper的delegateConnection.createStatement()/prepareStatement()作为构造参数的编码类。

    3-使用DataSourceWrapper重复该步骤。下面是一个简单的代码示例。

    public class DataSourceWrapper implements DataSource
    {
        private DataSource mDelegate;
    
        public DataSourceWrapper( DataSource delegate )
        {
            if( delegate == null ) { throw new NullPointerException( "Delegate cannot be null" );
            mDelegate = delegate;
        }
    
        public Connection getConnection(String username, String password)
        {
            return new ConnectionWrapper( mDelegate.getConnection( username, password ) );
        }
    
        public Connection getConnection()
        {
            ... <same as getConnection(String, String)> ...
        }
    }
    

    编写所有这些代码是快速且非常简单的,特别是如果您使用智能IDE(如Eclipse或IntelliJ),它将自动实现委派方法。

        4
  •  0
  •   omnikey omnikey    16 年前

    一种更动态的方法是开发一个过程并传入多行,然后让该过程将ref_游标返回给客户机。这样做的好处是避免了数据库上的硬解析,并提高了性能。

        5
  •  0
  •   Codek    16 年前

    该场景限制了一个临时报告工具,以便最终用户不会撤回太多记录并生成无法使用的报告。

        6
  •  0
  •       15 年前

    看看这个 page with a description 限制每次吸入Java应用程序的量。正如另一篇文章所指出的,DB仍然会提取所有的数据,这更多的是为了控制网络使用和Java端的内存。