java - postgresql 查询的大型结果集

标签 java spring postgresql jdbc spring-jdbc

我正在对 postgresql 数据库中的表运行查询。数据库在远程机器上。该表有大约 30 个使用 postgresql 的子表 partitioning capability .

查询将返回一个很大的结果集,大约有 180 万行。

在我的代码中,我使用了 spring jdbc 支持,方法 JdbcTemplate.query , 但我的 RowCallbackHandler没有被调用。

我最好的猜测是 postgresql jdbc 驱动程序(我使用版本 8.3-603.jdbc4)在调用我的代码之前在内存中累积结果。我以为 fetchSize configuration可以控制这个,但我试过了,没有任何改变。我这样做是作为 postgresql 手册 recomended .

当我使用 Oracle XE 时,此查询运行良好。但由于分区功能,我正在尝试迁移到 postgresql,这在 Oracle XE 中不可用。

我的环境:

  • PostgreSQL 8.3
  • Windows Server 2008 企业版 64 位
  • JRE 1.6 64 位
  • Spring 2.5.6
  • Postgresql JDBC 驱动程序 8.3-603

最佳答案

为了使用游标检索数据,除了设置获取大小外,还必须将 ResultSet 类型设置为 ResultSet.TYPE_FORWARD_ONLY(默认值)并将自动提交设置为 false。您链接到的文档中提到了这一点,但您没有明确提到您执行了这些步骤。

注意 PostgreSQL 的分区方案。它确实对优化器做了非常可怕的事情,并可能在不应该出现的地方导致大量性能问题(取决于您的数据的具体情况)。无论如何,您的行是否只有 1.8M 行?鉴于它已适当索引,因此没有理由仅根据大小对其进行分区。

关于java - postgresql 查询的大型结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827110/

相关文章:

postgresql - 在 PostgreSQL 中检索索引创建过程的进度

c# - Postgresql 和 Entity Framework

java - 当 EditText 更改时如何从 ArrayAdapter 中删除项目?

java - Sax 解析与 localname 不止一次出现

java - 如何在 Heroku 下的 java cedar 堆栈中强制执行 HTTPS

java - Spring boot中如何获取请求的url

java - 将 json 参数发布到 REST 服务时出错

java - Spring Boot 应用程序监听器未调用

java - Specification/Predicate 根据实例类型 Spring 搜索不同的字段

postgresql - 'Decimal' 和 'Numeric' 在 PostgreSQL 中不可用