当前位置: 首页 > 知识库问答 >
问题:

JDBC结果集支持分页吗?

富凯风
2023-03-14

JDBC ResultSet是否支持分页?或者我应该通过缓存结果集来在我的服务中实现内部分页。我寻找这样一个解决方案的原因是-我不允许更改表结构。如果允许,我可以有一个自动增量列,然后使用该列和限制上的子句获取数据。

共有2个答案

翟泰
2023-03-14

结果集应该尽可能快地被立即使用,因为只要它打开,它就会消耗数据库端的资源。即使某些结果集可以向后导航,也不应该在页面单击之间保持它们打开,以便向前或向后移动行。这些特殊的结果集用于其他目的(以奇怪的顺序处理行),而不是分页。

现在,您有两个选择:

>

  • 前端分页:浏览器接收表的所有行,但每页仅显示其中的几行。第一个页面加载可能会变慢,但是在页面之间移动时,需要与后端进行 bo 交互。

    后端分页:浏览器只接收您请求的行。这可能需要后端的“键集分页”。每次您移动到下一页或上一页时,都需要调用后端。

  • 施永宁
    2023-03-14

    < code>ResultSet本身并不进行分页,但是,根据数据库系统和驱动程序的不同,可能会成批获取结果。也就是说,当结果集需要更多行时,它将向服务器请求fetchSize行。

    这通常发生在调用< code>next()时,并且结果集没有可用的行(尽管一些实现甚至可能为了优化性能而提前这样做)。

    但是,默认情况下,MySQL连接器/J驱动程序将在执行时获取内存中的所有行。如Resultset下的JDBC API实现说明所述:

    默认情况下,将完全检索结果集并将其存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计,更容易实现。如果您正在使用具有大量行或大值的结果集,并且无法在 JVM 中为所需的内存分配堆空间,则可以告诉驱动程序一次将结果流式传输回一行。

    要启用此功能,请按以下方式创建语句实例:

    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                  java.sql.ResultSet.CONCUR_READ_ONLY); 
    stmt.setFetchSize(Integer.MIN_VALUE); 
    

    只进、只读结果集与读取大小 Integer.MIN_VALUE 的组合可作为驱动程序逐行流式传输结果集的信号。在此之后,将使用该语句创建的任何结果集都将逐行检索。

    [...但是请阅读警告...]

    另一种选择是使用基于光标的流,每次检索一组行。这可以通过将连接属性<code>useCursorFetch来实现,其中<code>int

    conn = DriverManager.getConnection("jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t");
    stmt = conn.createStatement();
    stmt.setFetchSize(100);
    rs = stmt.executeQuery("SELECT * FROM your_table_here");
    
     类似资料:
    • 主要内容:ResultSet类型,ResultSet的并发性,浏览结果集,查看结果集,更新结果集SQL语句执行后从数据库查询读取数据,返回的数据放在结果集中。 语句用于从数据库中选择行并在结果集中查看它们的标准方法。 接口表示数据库查询的结果集。 对象维护指向结果集中当前行的游标。 术语“结果集”是指包含在对象中的行和列数据。 接口的方法可以分为三类: 浏览方法:用于移动光标。 获取方法:用于查看光标指向的当前行的列中的数据。 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数

    • 问题内容: 我正在使用JDBC来实现非常简单的数据库连接。 我已经创建了连接/语句并执行了查询。我在调试器中检查语句的查询对象,以确认它正在发送正确的查询。然后,我再次检查了数据库中的查询(直接从调试器复制),以确保其返回数据。但是,返回的结果集在.next()上给出false 这里有我遗漏的常见陷阱吗? 还有myDB类(一个简单的包装程序,使我可以将连接/语句代码放入任何项目中) 编辑:根据建议

    • Panache支持分页吗?我似乎找不到任何相关的方法。我只找到 在这个调用之后,我将使用一个AggregateIterable。(http://mongodb.github.io/mongo-java-driver/3.12/javadoc/com/mongodb/client/aggregateiterable.html)

    • 在这个oracle java教程中,它说: TYPE_FORWARD_ONLY:结果集不能滚动;其光标仅向前移动,从第一行之前移动到最后一行之后。结果集中包含的行取决于基础数据库如何生成结果。也就是说,它包含在执行查询时或在检索行时满足查询的行。 “结果集中包含的行取决于基础数据库生成结果的方式。 查询执行时间和行检索时间有什么区别?我如何知道我的数据库支持哪些?提前致谢。

    • 问题内容: 当使用各种JDBC模板方法之一时,我对如何迭代/滚动大结果集(不适合内存)感到困惑。即使没有直接公开Iterable接口,我至少也希望RowQuerybackHandler实例在查询执行后( 而 不是在堆溢出之后)执行时被调用。 我也有在看一个这个(这什么都没有改变,我尽管是在精神上类似这个帖子上的堆栈溢出),并在该岗位在spring论坛。后者似乎暗示在游标获取数据时确实应该调用回调处

    • JDBC是否有专门从Hive查询放入ResultSet的最大行数?我说的不是获取大小或分页,而是ResultSet中返回的总行数。 如果我错了,请更正,但获取大小设置了jdbc在数据库中每次传递时要处理的行数,并将适当的响应插入到结果集中。当它遍历了表中的所有记录后,它将结果集返回给Java代码。我问返回到Java代码的行数是否有限制。 如果它没有最大行数,则该类是否有任何固有的内容可能导致某些记