JDBC ResultSet是否支持分页?还是应该通过缓存结果集在服务中实现内部分页。我正在寻找这样的解决方案的原因是-不允许更改表结构。如果允许,我可以创建一个自动增量列,然后使用该列和限制上的子句获取数据。
答案 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交互。
后端分页:浏览器仅接收您请求的行。这可能需要在后端进行“密钥设置分页”。每当您移至下一页或上一页时,都需要调用后端。