Java JDBC忽略setFetchSize?

kre*_*jer 12 java postgresql jdbc cursor

我正在使用以下代码

 st = connection.createStatement(
            ResultSet.CONCUR_READ_ONLY,
            ResultSet.FETCH_FORWARD,
            ResultSet.TYPE_FORWARD_ONLY
             );
 st.setFetchSize(1000);
 System.out.println("start query ");
 rs = st.executeQuery(queryString);
 System.out.println("done query");
Run Code Online (Sandbox Code Playgroud)

查询返回大量(800k)行,并且在打印"开始查询"和"完成查询"之间需要很长时间(~2m).当我在查询中手动设置"限制10000"时,"开始"和"完成"之间没有时间.处理结果需要花费时间,所以我想如果它只是从数据库中获取1k行,处理这些行,并且当它用尽行时它可以在后台获得新行,则总体上更快.

结果集.CONCUR_READ_ONLY等我最后猜测的地方; 我错过了什么吗?

(这是一个postgresql 8.3服务器)

dog*_*ane 24

尝试关闭自动提交:

// make sure autocommit is off
connection.setAutoCommit(false);

 st = connection.createStatement();
 st.setFetchSize(1000);
 System.out.println("start query ");
 rs = st.executeQuery(queryString);
 System.out.println("done query");
Run Code Online (Sandbox Code Playgroud)

参考

  • 确切地。setFetchSize 在使用 PostgresSQL JDBC 驱动程序的自动提交模式下不起作用。 (2认同)
  • 值得注意的是,如果您使用连接池,并且应用程序的其他部分依赖于自动提交,则您可能需要在关闭连接之前重新打开自动提交。否则,在未明确提交时,您最终可能会随机丢失数据。 (2认同)
  • 有关此 PostgreSQL JDBC 限制的更多详细信息,请访问 http://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor。 (2认同)

Jon*_*eet 2

这将取决于您的司机。来自文档:

向 JDBC 驱动程序提供有关当需要更多行时应从数据库获取的行数的提示。指定的行数仅影响使用此语句创建的结果集。如果指定的值为零,则忽略提示。默认值为零。

请注意,它说的是“提示” - 我认为这意味着驾驶员可以忽略该提示(如果它确实愿意的话)......听起来这就是正在发生的事情。