我运行一个查询表在postgresql数据库。该数据库是在远程机器。该表具有约30子表格使用postgresql 分区能力.

查询将返回的一大的结果,周围的东西1.8亿行。

在我的代码,我在使用弹簧jdbc支持,方法 其作为参数.查询, 但是我的 RowCallbackHandler 是不是正在叫。

我最好的猜测是,postgresql jdbc司机(I使用的版本8.3-603.jdbc4)是累积的结果在存储器之前叫我的代码。我以为 fetchSize配置 可以控制这一点,但我想它并没有什么变化。我这样做是为postgresql manual 推荐.

这个查询工作,现时我用Oracle XE。但我在试图迁移到postgresql因为该分区特性,这是不可Oracle XE。

我的环境:

  • Postgresql8.3
  • Windows服务器的2008年企业64位
  • Java运行环境1.6 64位
  • 弹簧2.5.6
  • Postgresql JDBC驱动8.3-603
有帮助吗?

解决方案

为了使用标来检索数据的设的结果集型的结果集。TYPE_FORWARD_ONLY(默认)和自动提交虚假设定一个获取大小。中引用的文档,你联系但是你没明确说过你没有这些步骤。

小心PostgreSQL的分区方案。它确实很可怕的事情有优化程序,并可能导致大规模性问题不应该(根据具体情况的数据)。在任何情况下,是你的行只有1.8米行?没有任何理由,它将需要分配的基础上大小的单独鉴于它是适当地编入索引。

其他提示

我打赌没有一个单个客户的应用程序,需要1.8米的行有在同一时间。你应该想到一个明智的方式块的结果成更小的碎片而给用户有机会迭代他们。

这就是谷歌一样。当你做一个搜索可能有数百万的点击,但他们返回25页,在一段时间的想法,你会找到你想要什么在第一页。

如果它不是一个客户,并将结果正在按摩在一些方式,我建议让的数据库紧缩,所有这些行和简单地返回的结果。这是没有意义的返回1.8米的行只是要做一个计算在中间层。

如果没有这些申请,你已经有了一个真正的问题。时间重新考虑它。

在阅读了之后回答我觉得这是更多的报告解决方案,应该嘎吱嘎吱在批量或计算出的在现实的时间和存储在表不属于你的事务系统。有没有办法带来的1.8米的行为的中间层,用于移动平均数计算的可规模。

我建议重新调整自己-开始思考它作为一个报告解决方案。

该fetchSize财产作为描述 postgres手册.

我的错是我设置自动提交=false的连接从一个连接池,是不是连接正在使用准备好的发言。

感谢所有的反馈意见。

我所做的一切,上述,但我需要一个最后的作品:可以肯定的电话被包裹在一个事务组的交易以只读,所以没有回退状态是必需的。

我加入这样的: @Transactional(readOnly = true)

欢呼声。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top