JDBC ResultSet是否支持分页?

时间:2020-09-20 15:55:49

标签: mysql jdbc resultset

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

2 个答案:

答案 0 :(得分:2)

ResultSet不会进行分页,但是-根据数据库系统和驱动程序-结果可能会分批提取。也就是说,结果集将在需要更多行时从服务器请求 fetchSize 行。

通常会在调用next()并且结果集没有可用行的情况下发生(尽管某些实现可能甚至更早地将其作为性能优化)。

但是,默认情况下,MySQL Connector / J驱动程序将在执行时获取内存中的所有行。如{strong>结果集下的JDBC API Implementation Notes所述:

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

要启用此功能,请在以下位置创建一个Statement实例: 如下方式:

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

只读,只读结果集与访存的组合 Integer.MIN_VALUE的大小可向驱动程序发送信号 结果集逐行显示。之后,使用 语句将逐行检索。

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

另一种选择是使用基于游标的流来检索集合 每次的行数。可以通过设置连接来完成 属性useCursorFetch设置为true,然后调用setFetchSize(int) 其中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");

答案 1 :(得分:0)

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

现在,您有两个选择:

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

  • 后端分页:浏览器仅接收您请求的行。这可能需要在后端进行“密钥设置分页”。每当您移至下一页或上一页时,都需要调用后端。