【问题标题】:How to set Cursor type in JDBC?如何在 JDBC 中设置光标类型?
【发布时间】:2010-09-25 03:07:01
【问题描述】:

我正在运行 tomcat 并且有一些显示表格子集的 jsp 页面。我在单个页面上一次显示 20 行。当表格有大量数据时,jsp页面不呈现。我猜 ResultSet 正在使用客户端游标。我过去使用过 ASP,我们总是使用服务器端仅向前游标,并且在处理大量数据时从未遇到任何问题。我们的数据库是 oracle 10g。

如何在 JDBC 中指定服务器端只进游标?

【问题讨论】:

    标签: java oracle jdbc cursors


    【解决方案1】:
    Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY);
    ResultSet rs = stmt.executeQuery(sql);
    

    这应该设置它,但显然一些驱动程序会忽略它。

    您总是可以尝试在 ResultSet 级别重新设置它。

    rs.setFetchDirection(ResultSet.TYPE_FORWARD_ONLY);
    

    希望对您有所帮助。

    【讨论】:

    • 根据 Connection createStatement 文档,默认情况下该类型仅转发...实际上,对于大量数据,性能优势在于服务器端光标位于仅转发部分.不过我会加入这个。
    • 请注意,我尝试了此代码并进行了少量修改,但在添加 stmt.setFetchSize(Integer.MIN_VALUE); 之前我没有看到服务器端游标类型行为;
    【解决方案2】:

    oracle 驱动程序通过 FetchSize 属性实现服务器端游标。

    不幸的是,JDBC 并没有明确地允许设置客户端游标和服务器端游标,因此不同的驱动程序以不同的方式实现它。以下是其他有帮助的链接:

    Fetch Size
    Cursors
    Oracle Driver

    【讨论】:

      【解决方案3】:

      没有完全回答这个问题,但您是否考虑过在 WHERE 子句中使用 ROWNUM 或 ROWNUMBER 将分页显式添加到 SELECT 查询?

      eg:对于第二页数据,20元素页面大小:

      SELECT * 
        FROM MyDataObjects
        WHERE rownum > 20 AND rownum < 41
      

      这将确保最多返回一页记录,消除大游标问题。

      【讨论】:

      • 我认为在 oracle 中,您需要使用子查询嵌套 rownum ......但我们已经考虑过了。我们的系统相当复杂,包括实时过滤,可在查看包含大量不同事物的多个列表时应用...动态 SQL 使得通过 rownum 进行分页变得更加困难。
      • 在 Oracle 中,只有在使用 ORDER BY 时,rownum 才需要在子查询中... Oracle 在执行 ORDER BY 之前分配 rownum,因此使用 where 和 rownum 最终会按未排序的行号选择行.
      • 哎呀,这就是我编写查询而不测试它们的结果。谢谢指正...
      猜你喜欢
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多