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

Spring JDBC支持和大型数据集

  •  18
  • yawn  · 技术社区  · 15 年前

    当使用各种JDBC模板方法之一时,我对如何迭代/滚动大型结果集(不适合内存)感到困惑。即使不直接暴露一个可重写的接口,我至少也希望调用rowcallbackhandler的实例。 虽然 查询不是在完成后执行(或堆溢出)。

    我确实看了一眼 this (尽管在精神上与 this post 在堆栈溢出时)和 this 在春季论坛发帖。后者似乎建议在光标获取数据时调用回调处理程序。然而,我的测试没有显示出这种行为。

    数据库是Oracle10g。我使用的是11.1.0.7.0生产驱动程序和Spring2.5.6.sec01。有没有人知道如何迭代结果集,最好是在保留rowmapper等的映射逻辑的情况下?

    5 回复  |  直到 8 年前
        1
  •  20
  •   skaffman    15 年前

    Oracle JDBC驱动程序对 setFetchSize() 方法对 java.sql.Statement ,它允许您控制驱动程序一次将获取多少行。

    然而, RowMapper 正如Spring所使用的,通过将每一行读取到内存中, 罗梅珀 将它转换成一个对象,并将每行的对象存储在一个大列表中。如果结果集很大,那么不管JDBC如何获取行数据,这个列表都会变大。

    如果需要处理大型结果集,则rowmapper不可缩放。你可以考虑使用 RowCallbackHandler 而是与JDBCTemplate上的相应方法一起使用。 RowCallBackhandler 不会指定结果的存储方式,而是由您来存储。

        2
  •  5
  •   alexkasko    12 年前

    你可以用 springjdbc-iterable 图书馆:

    CloseableIterator<MyObj> iter = jt.queryForIter("select ...", params, mapper);
    

    迭代器将在耗尽时自动关闭,或者可以手动关闭。它只能在事务界限内工作。

    免责声明:我写了这个图书馆

        3
  •  4
  •   oxbow_lakes    15 年前

    它是驱动程序/连接的一个属性,不管是将数据流返回给您,还是将其发送回一个块中。例如,在SQL Server中,使用 SelectMethod 连接URL上的属性:

    jdbc:microsoft:sqlserver://gsasql03:1433;DatabaseName=my_db;SelectMethod=direct

    价值 direct 这意味着结果应该一次性得到。另一个选择是 cursor ,这允许您指定希望连接将结果流返回给您。我不知道什么样的模拟 甲骨文公司 恐怕数据来源是

    这个 RowCallbackHandler 当然适合我。

        4
  •  0
  •   marc_s    8 年前
    1. 创建扩展 StoredProcedure
    2. 创建一个 RowCallBackHandler 可以处理每一行,一次一行。
    3. 声明参数。如果有结果集,请首先声明该结果集。使用 SqlReturnResultSet 类并使用 RowCallBackhandler
    4. 声明任何其他参数
    5. 编译
    6. 我在客户存储过程的构造函数中执行了步骤2到5
    7. 创建包含输入参数的映射
    8. 使用输入参数执行存储过程

    我将提供代码,但下面的文章包含所有这些信息。

    Calling Stored Procedures with Spring JDBC Templates

        5
  •  -3
  •   jli_123    14 年前

    这里有一个很好的库,用于将Java SQL结果集全部拉入内存中。

    http://casperdatasets.googlecode.com

    您可以滚动/迭代数据集,对其发出查询,并构建索引以进行优化。它还实现了java.sql.resultset接口,这样您就可以继续使用这个数据集的结果,并将最少的技术转换为JDBC代码。