打印数百万行/ JAVA堆空间

时间:2015-01-22 18:10:12

标签: java jdbc

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

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

我可以使用包含5738095行的整个结果集

但是如果我想使用超过7百万行的数据库我得到错误“Java堆空间”,我已经开始使用3GB和2GB用于tomcat但是当我开始使用超过3百万的我需要向我的服务器添加更多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();

5 个答案:

答案 0 :(得分:4)

您不必将所有行都读入RAM以进行打印。连接到DB,在迭代结果集时执行选择并逐行打印。相信我,百万行不算什么。

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

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

答案 1 :(得分:2)

在当前设置中,检查实际上有多少行 在调用SQL查询时从DB加载。参见:

Statement.setFetchSize

如果你的JDBC驱动程序支持延迟加载,你应该尝试使用延迟加载。

另见:

Java JDBC Lazy-Loaded ResultSet

所以我的意思是,你打算用LIMITOFFSET做什么,
JDBC驱动程序已经可以为您完成。

答案 2 :(得分:0)

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

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

很可能你的程序效率不高,所以一个简单的解决方法就是使用这种方法。

答案 3 :(得分:-1)

您可以从application或cron执行命令,并使用它来创建格式为csv的文档 Mysqldump in CSV format

答案 4 :(得分:-1)

Dame puntos amigo

mysqldump -u username -p db_name table1_name&gt; dump.sql