Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java postgresql查询的大型结果集_Java_Spring_Postgresql_Jdbc_Spring Jdbc - Fatal编程技术网

Java postgresql查询的大型结果集

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数据库中的表运行查询。数据库位于远程计算机上。该表大约有30个子表使用postgresql

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

在我的代码中,我使用SpringJDBC支持,方法,但我的方法没有被调用

我最好的猜测是postgresql jdbc驱动程序(我使用版本8.3-603.jdbc4)在调用我的代码之前正在内存中累积结果。我原以为电脑可以控制,但我试过了,什么也没变。我是按照postgresql手册做的

当我使用OracleXE时,这个查询工作得很好。但我正试图迁移到postgresql,因为分区功能在Oracle XE中不可用

我的环境:

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

我敢打赌,你的应用程序没有一个客户端同时需要180万行。您应该考虑一种明智的方法,将结果分为更小的部分,并让用户有机会对其进行迭代

谷歌就是这么做的。当你进行搜索时,可能会有数百万次的点击,但他们一次返回25页,并认为你会在第一页找到你想要的

如果它不是一个客户机,并且结果以某种方式被篡改,我建议让数据库处理所有这些行并简单地返回结果。仅仅为了在中间层进行计算而返回180万行是没有意义的

如果两者都不适用,那你就有真正的问题了。是时候重新思考了

在阅读了后面的回复之后,我觉得这更像是一个报告解决方案,应该批量处理或实时计算,并存储在不属于事务系统的表中。将180万行带到中间层计算移动平均线是不可能的


我建议你重新定位自己——开始把它当作一个报告解决方案

要使用光标检索数据,除了设置提取大小外,还必须将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个子表(天)被链接。正在使用分区使此维护更加可行。