Java JDBC ignores setFetchSize?

2022-09-03 17:34:04

我正在使用以下代码

 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");

查询返回大量 (800k) 行,在打印“开始查询”和“完成查询”之间需要花费大量时间(约 2m)。当我在查询中手动输入“限制10000”时,“开始”和“完成”之间没有时间。处理结果需要时间,所以我想如果它只是从数据库中获取1k行,处理这些行,并且当它用完行时,它可以在后台获得新的行,那么它总体上会更快。

ResultsSet.CONCUR_READ_ONLY等,我最后的猜测;我错过了什么吗?

(这是一个postgresql 8.3服务器)


答案 1

尝试关闭自动提交:

// 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");

参考


答案 2

我注意到你对API的使用与Javadoc表达的不同:

尝试按此顺序传递参数

  ResultSet.TYPE_FORWARD_ONLY,
  ResultSet.CONCUR_READ_ONLY,
  ResultSet.FETCH_FORWARD

推荐