Java postgresql查询的大型结果集
我正在对postgresql数据库中的表运行查询。数据库位于远程计算机上。该表大约有30个子表使用postgresql 查询将返回一个大的结果集,大约180万行 在我的代码中,我使用SpringJDBC支持,方法,但我的方法没有被调用 我最好的猜测是postgresql jdbc驱动程序(我使用版本8.3-603.jdbc4)在调用我的代码之前正在内存中累积结果。我原以为电脑可以控制,但我试过了,什么也没变。我是按照postgresql手册做的 当我使用OracleXE时,这个查询工作得很好。但我正试图迁移到postgresql,因为分区功能在Oracle XE中不可用 我的环境:Java postgresql查询的大型结果集,java,spring,postgresql,jdbc,spring-jdbc,Java,Spring,Postgresql,Jdbc,Spring Jdbc,我正在对postgresql数据库中的表运行查询。数据库位于远程计算机上。该表大约有30个子表使用postgresql 查询将返回一个大的结果集,大约180万行 在我的代码中,我使用SpringJDBC支持,方法,但我的方法没有被调用 我最好的猜测是postgresql jdbc驱动程序(我使用版本8.3-603.jdbc4)在调用我的代码之前正在内存中累积结果。我原以为电脑可以控制,但我试过了,什么也没变。我是按照postgresql手册做的 当我使用OracleXE时,这个查询工作得很好。但
- Postgresql 8.3
- Windows Server 2008企业版64位
- JRE 1.6 64位
- 春季2.5.6
- Postgresql JDBC驱动程序8.3-603
我建议你重新定位自己——开始把它当作一个报告解决方案 要使用光标检索数据,除了设置提取大小外,还必须将ResultSet.type_FORWARD_(默认)的ResultSet类型和autocommit设置为false。这在您链接到的文档中被引用,但您没有明确提到您执行了这些步骤
小心PostgreSQL的分区方案。它在优化器中确实做了非常可怕的事情,并且可能会在不应该出现的地方(取决于数据的具体情况)导致大量性能问题。在任何情况下,您所在的行是否只有180万行?没有理由仅根据大小对其进行分区,因为它已被适当索引。fetchSize属性的工作方式与中所述的相同 我的错误是,我将auto commit=false设置为来自连接池的连接,该连接不是准备好的语句所使用的连接
感谢所有的反馈。我完成了上面的所有工作,但我需要最后一点:确保调用包装在事务中,并将事务设置为只读,这样就不需要回滚状态 我添加了以下内容:
@Transactional(readOnly=true)
干杯 你的电话有回音吗?如果没有,请尝试ctrl-\(Windows的ctrl-break)、jstack、jconsole、visualvm或类似方法来查找线程停止的位置?它正在驱动程序内处理查询。另请参阅数据库加载在系统启动时完成,以对数据进行处理并将其“转换”为更适合客户端使用的格式。RowCallbackHandler本身中没有要配置的内容。但是在连接、数据源、驱动程序或数据库设计上有很多配置。在生产服务器上调试这个有点困难,因为那里有大量数据。日志记录是我的全部。是的,我完成了文档中描述的所有步骤(仅键入\u FORWARD\u和autocommit false)。1.8M是我目前的样本。数据按天进行分区,每个分区一天。每天大约有40万排。恐怕到时候我帮不上忙了。我对pg JDBC驱动程序和多GB分析查询的获取大小没有任何问题,但我没有使用spring库的经验。作为一个测试,我会在没有分区的情况下尝试它。您希望数据集增长到多大?以每天40万行的速度,我不希望您当前的算法能持续那么长时间。在不完全了解您的用例的情况下,我建议您开始研究数据仓库技术,如星型模式和数据维度。谢谢Trey的帮助。我正在存储历史市场数据。我将使用30天的数据。从今天到30天前,这就像一个30天的滑动窗口。每天都会修改继承以链接新分区和取消链接旧分区。数据将在那里保存一年左右,但在给定的时间只有30个子表(天)被链接。正在使用分区使此维护更加可行。