我通过java程序连接oracle db。问题是我得到了Outofmemeory异常,因为sql返回了300万条记录。由于某种原因,我无法增加JVM堆积。
解决此问题的最佳解决方案是什么?
唯一的选择是使用LIMIT运行sql吗?
答案 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
考虑使用有意义的 where子句
使用oracle提供的工具将数据库条目导出为txt或csv或excel格式,并使用该文件供您使用..
干杯: - )
答案 6 :(得分:0)
重新考虑你的where子句。看看你是否可以使它更具限制性。 和/或 使用限制
答案 7 :(得分:0)
仅供参考,在Oracle查询中,LIMIT
为ROWNUM
例如,... WHERE ROWNUM<=1000
答案 8 :(得分:0)
如果得到那么大的响应,那么请注意逐行处理结果集,这样完整的结果就不需要在内存中。如果您正确地执行此操作,您可以毫无问题地处理大量数据集。