首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jaybird (火鸟JDBC) ResultSet FetchSize -分页持久查询

Jaybird (火鸟JDBC) ResultSet FetchSize -分页持久查询
EN

Stack Overflow用户
提问于 2016-02-19 17:11:31
回答 1查看 698关注 0票数 0

我正试图找到一种方法来强迫jaybird在ResultSet中进行“分页”。假设我们有一些持久的sql查询(例如,它在15秒内返回5000行)。然而,获取前50行(随机)只需要一小部分秒。只要我们不向查询添加order子句,服务器就会快速返回第一行,这些行可以立即在客户端应用程序中显示。这是flamerobin客户端的默认行为。

我试图通过设置如下代码中的语句参数来模拟这种行为,但没有成功。有没有办法强迫jaybird不将所有行加载到ResultSet?我认为stmt.setFetchSize(50)方法有这个目的,但它可能是错误的。Jaybird版本为2.2.7,Firebird版本为2.5.4。谢谢你的建议。

代码语言:javascript
复制
String user = "user";
String pass = "pass";
Connection conn = DriverManager.getConnection(s, user, pass);
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
conn.setAutoCommit(false);
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(50);
stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
ResultSet rs = null;
String sql = "select * from TABLE"; //long lasting select 
boolean ok = stmt.execute(sql);
if (ok) {
    rs = stmt.getResultSet();
    while (rs.next()) {
         //do something
    }
}
if (rs != null) {
    rs.close();
}

if (stmt != null) {
    stmt.close();
}

我试图实现与flamerobin客户端相同的想法--在数据动态加载到表中(只有当我们需要它们时--在表中向下滚动)。我们开发了两层ERP系统(DB server firebird,client on netbeans平台)的客户端应用程序,.We编写了一些数据库组件,它们按照以前的"interbase Delphi components“的原理,用数据填充JXTable。上面的代码是辛化的,在组件代码中,我们将前100行加载到JTable表模型中,当用户滚动时,我们再加载100行等等。但是,我注意到前100行的加载时间与将所有行加载到dataset相同。这就是密码

代码语言:javascript
复制
boolean ok = stmt.execute(sql);
if (ok) {
    rs = stmt.getResultSet();
    int rows = 0;
    while (rs.next() rows < 100) {
         //do something
         rows++;
    }
}

实际上是和第一批源代码同时使用的。看来,stmt.execute(sql)命令等待直到从服务器返回所有选择行。但是,我设置了希望获得50行块的设置,因此我假设从DB服务器获得前50行后立即启动while循环。因此,我希望在获取前50行(就像设置了stmt.setMaxRows(50))之后开始open循环,但是我希望有机会让结果集打开,并根据需要获取另一个行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-20 08:36:12

使用setFetchSize通常完全符合您的预期:它将按指定大小的批处理获取行(Firebird 3可以决定在它认为批处理太大时返回更少的数据)。

但是,正如您在连接字符串中指定了defaultHoldable一样,结果集是HOLD_CURSORS_OVER_COMMIT,可保留的结果集在返回之前是完全缓存客户端的。

您需要将此特定语句的可保持性设置为CLOSE_CURSORS_AT_COMMIT,或者--如果对所有语句都这样做--只需从连接字符串中删除defaultHoldable

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35510940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档