Java Sql返回300万条记录,JVM outofmemory异常

Java Sql返回300万条记录,JVM outofmemory异常,java,database,optimization,Java,Database,Optimization,我正在通过java程序连接oracle db。问题是,由于sql返回了300万条记录,所以我正在退出内存异常。由于某些原因,我无法增加JVM堆化 解决这个问题的最佳解决方案是什么 唯一的选择是运行有限制的sql吗?在我看来,有返回300万条记录的查询是没有意义的。你会怎么处理它们?将它们呈现给用户没有任何意义,如果您想进行一些计算,最好运行多个查询,返回的记录要少得多 使用LIMIT是一种解决方案,但更好的解决方案是重新构造数据库和应用程序,这样您就可以使用“更智能”的查询,而不是一次性返回所有

我正在通过java程序连接oracle db。问题是,由于sql返回了300万条记录,所以我正在退出内存异常。由于某些原因,我无法增加JVM堆化

解决这个问题的最佳解决方案是什么


唯一的选择是运行有限制的sql吗?

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


使用LIMIT是一种解决方案,但更好的解决方案是重新构造数据库和应用程序,这样您就可以使用“更智能”的查询,而不是一次性返回所有内容。例如,您可以基于日期列返回记录。通过这种方式,您可以获得最新的记录。

如果您的程序需要同时返回3 mil记录,则说明您做错了。如果需要一次处理3 mil记录,您需要做什么

您可以使用LIMIT将查询拆分为较小的查询,也可以重新考虑如何减少需要处理的数据量。

尝试以下方法:


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

  • 考虑使用有意义的where子句

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


  • 干杯:-)

    重新考虑你的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万条记录,那个么增加堆大小是他无法长期避免的事情。