打印数百万行/JAVA堆空间

打印数百万行/JAVA堆空间,java,jdbc,Java,Jdbc,我正在处理一些数据库,我需要在文件中打印每个数据库。 我的服务器有5GB的RAM,我只为tomcat服务器分配了4GB 我制作了一个简单的结果集,它可以查询每个数据库的所有行。 然后我打印文件(.dat)中的每一行(显然,我是单独打印的) 我可以处理包含5738095行的整个结果集 但是如果我想处理一个超过700万行的数据库,我得到了错误“Java堆空间”,我已经开始为tomcat使用3GB和2GB,但是当我开始处理超过300万行时,我需要向服务器添加更多RAM,所以我的问题是,在我的服务器上放

我正在处理一些数据库,我需要在文件中打印每个数据库。 我的服务器有5GB的RAM,我只为tomcat服务器分配了4GB

我制作了一个简单的结果集,它可以查询每个数据库的所有行。 然后我打印文件(.dat)中的每一行(显然,我是单独打印的)

我可以处理包含5738095行的整个结果集

但是如果我想处理一个超过700万行的数据库,我得到了错误“Java堆空间”,我已经开始为tomcat使用3GB和2GB,但是当我开始处理超过300万行时,我需要向服务器添加更多RAM,所以我的问题是,在我的服务器上放更多的RAM好吗?或者我如何划分结果集并以百万分之一的速度打印,而不会得到错误“java堆空间”

我一直在考虑对整个数据库进行计数,并做出一些类似于限制0偏移1000000,限制1000000偏移1000001的东西,但我真的迷路了。谢谢你的阅读和帮助,对不起我的英语

有一些密码

//numero columnas is the total of columns
 rs_datos =  StDatos.executeQuery("select * from table");
  while(rs_datos.next())
  {

    for(int i = 0; i < numeroColumnas; i++)
    {
      if(i+1 == numeroColumnas)
      {
       pw.print(rs_datos.getString(i+1));
      }
      else
      pw.print(rs_datos.getString(i+1) + "|");
    }

     pw.println("");
  }

  pw.close();
//numero columns是列的总数
rs_datos=StDatos.executeQuery(“从表中选择*);
while(rs_datos.next())
{
对于(int i=0;i
在当前设置中,检查实际有多少行
调用SQL查询时从数据库加载。见:

如果JDBC驱动程序支持延迟加载,那么应该尝试使用它

另见:

我的意思是,你打算用
限制
偏移量


JDBC驱动程序已经可以为您完成

您不必将所有行读入RAM来打印它们。连接到DB,执行select并逐行打印,同时迭代结果集。百万行算不了什么,相信我

显然,您也可以使用分页,但在您的情况下,您甚至可能不需要它


最后一点。我真的不明白你为什么要自己实现这种DB导出。所有数据库都有这样的实用程序可以使用。例如,MySQL的
mysqldump
。只需找到这样的实用程序,它可以与您的数据库一起工作,并组成正确的命令行参数

如果需要备份特定的表,只需从命令行执行mysqldump:

mysqldump -u... -p... mydb mytable > my_backup.sql

很可能您的程序效率不高,因此一个简单的解决方法是使用此方法。

您可以从应用程序或cron执行命令,并使用此命令以csv格式创建文档 给我点数,朋友


mysqldump-u username-p db_name table 1_name>dump.sql

应该与内存大小无关。一个正确编写的循环,简单地将一些DB结果导入到一个文件中,不应该占用4gig的ram,除非您处理的是一些巨大的blob记录。您使用的是哪个数据库?mysql/JSP+JDBC。我做了选择,然后当我有了整个结果集时,我将其打印到文件中。我不知道如何“正确地”将所有结果集计入RAM,但谢谢,我将搜索其他实用程序来完成我的工作。@zickno,您尚未显示代码,因此很难帮助您。展示你的代码片段,我们可能会给你一个更好的建议。