Java Sql返回300万条记录,JVM outofmemory异常
我正在通过java程序连接oracle db。问题是,由于sql返回了300万条记录,所以我正在退出内存异常。由于某些原因,我无法增加JVM堆化 解决这个问题的最佳解决方案是什么Java Sql返回300万条记录,JVM outofmemory异常,java,database,optimization,Java,Database,Optimization,我正在通过java程序连接oracle db。问题是,由于sql返回了300万条记录,所以我正在退出内存异常。由于某些原因,我无法增加JVM堆化 解决这个问题的最佳解决方案是什么 唯一的选择是运行有限制的sql吗?在我看来,有返回300万条记录的查询是没有意义的。你会怎么处理它们?将它们呈现给用户没有任何意义,如果您想进行一些计算,最好运行多个查询,返回的记录要少得多 使用LIMIT是一种解决方案,但更好的解决方案是重新构造数据库和应用程序,这样您就可以使用“更智能”的查询,而不是一次性返回所有
唯一的选择是运行有限制的sql吗?在我看来,有返回300万条记录的查询是没有意义的。你会怎么处理它们?将它们呈现给用户没有任何意义,如果您想进行一些计算,最好运行多个查询,返回的记录要少得多
使用LIMIT是一种解决方案,但更好的解决方案是重新构造数据库和应用程序,这样您就可以使用“更智能”的查询,而不是一次性返回所有内容。例如,您可以基于日期列返回记录。通过这种方式,您可以获得最新的记录。如果您的程序需要同时返回3 mil记录,则说明您做错了。如果需要一次处理3 mil记录,您需要做什么 您可以使用LIMIT将查询拆分为较小的查询,也可以重新考虑如何减少需要处理的数据量。尝试以下方法:
有三种可能的解决方案 1.如果不需要一次检索300万条记录。。使用限制
干杯:-)重新考虑你的where条款。看看你能不能更严格些。 和/或
使用限制应用程序缩放始终是一个问题。这里的解决方案是将您在Java中尝试执行的任何操作作为Oracle PL/SQL中的存储过程。让oracle处理数据,并使用内部查询计划器来限制数据流入或流出的数量,这可能会导致较大的延迟 您甚至可以在中编写存储过程
第二种解决方案是从几个java节点进行有限的查询和处理,并整理结果。查找map reduce。仅供参考,在Oracle查询中,
限制是
例如,。。。其中ROWNUM如果每条记录大约为1KB,这意味着3gb的数据,那么您的应用程序是否有足够的可用内存
如果您解释“真正”的问题,应该会更好,因为OutOfMemory不是您的实际问题。如果您得到如此大的响应,请注意逐行处理结果集,这样完整的结果就不需要存储在内存中。如果这样做得当,您可以毫无问题地处理大量数据集 这是哪个数据库服务器,哪个JDBC驱动程序?您是如何“尝试”增加jvm堆大小的?有些原因不够明确。你想用3百万记录做什么?也许您可以使用一些SQL运算符在数据库端执行一些计算。1)您真的需要300万条记录还是查询出现故障?2) 你的堆大小是多少?3) 拉取300万条记录的目的是什么?返回300万条记录可能并非毫无意义。应用程序可能出于某种报告和分析目的而拉取这些记录。如果确实需要300万条记录,请将它们分成小块处理。是的,这是一种方法。我认为,若用户真的需要300万条记录,那个么增加堆大小是他无法长期避免的事情。