Sql返回300万条记录和JVM outofmemory Exception

时间:2010-01-20 08:25:59

标签: java database optimization

我通过java程序连接oracle db。问题是我得到了Outofmemeory异常,因为sql返回了300万条记录。由于某种原因,我无法增加JVM堆积。

解决此问题的最佳解决方案是什么?

唯一的选择是使用LIMIT运行sql吗?

9 个答案:

答案 0 :(得分:3)

如果您的程序需要一次返回3 mil记录,那么您做错了。你需要做什么,需要一次处理3密耳的记录?

您可以使用LIMIT将查询拆分为较小的查询,或重新考虑您需要做些什么来减少需要处理的数据量。

答案 1 :(得分:2)

在我看来,拥有返回300万条记录的查询毫无意义。你会怎么处理他们?将它们呈现给用户没有任何意义,如果您想进行一些计算,最好运行多个返回相当少的记录的查询。

使用LIMIT是一种解决方案,但更好的解决方案是重构数据库和应用程序,以便您可以拥有“智能”查询,而不会一次性返回所有内容。例如,您可以根据日期列返回记录。这样你可以拥有最新的。

答案 2 :(得分:1)

应用程序扩展始终是一个问题。这里的解决方案将作为Oracle PL / SQL中的存储过程执行您在Java中尝试执行的任何操作。让oracle处理数据并使用内部查询规划器来限制流出的数据量,并可能导致严重的延迟。

您甚至可以在Java

中编写存储过程

第二个解决方案是确实从几个java节点进行有限的查询和处理并整理结果。查看map-reduce。

答案 3 :(得分:1)

如果每条记录大约1千字节,这意味着3GB的数据,那么您的应用程序是否有可用的内存量?

如果您解释“真实”问题应该会更好,因为OutOfMemory不是您的实际问题。

答案 4 :(得分:0)

答案 5 :(得分:0)

可能有三种可能的解决方案 1.如果不需要一次检索300万条记录,请使用 LIMIT

  1. 考虑使用有意义的 where子句

  2. 使用oracle提供的工具将数据库条目导出为txt或csv或excel格式,并使用该文件供您使用..

  3. 干杯: - )

答案 6 :(得分:0)

重新考虑你的where子句。看看你是否可以使它更具限制性。 和/或 使用限制

答案 7 :(得分:0)

仅供参考,在Oracle查询中,LIMITROWNUM

例如,... WHERE ROWNUM<=1000

答案 8 :(得分:0)

如果得到那么大的响应,那么请注意逐行处理结果集,这样完整的结果就不需要在内存中。如果您正确地执行此操作,您可以毫无问题地处理大量数据集。