使用Java将Result set下载为平面文件

时间:2013-12-31 07:27:06

标签: java download

在我的应用程序中,我遇到了一个场景,用户可能会要求将报告下载为平面文件,最多可能有17个Lakhs记录(大约650 MB)的数据。在此请求期间,我的应用程序服务器停止服务其他线程或发生内存不足异常。

截至目前,我正在遍历结果集并将其打印到文件中。

当我谷歌出来时,我遇到了一个名为OpenCSV的API。我也尝试了,但我没有看到性能有任何改善。

请帮我解决这个问题。

感谢快速回复的人,在这里我添加了我的代码快照

   try {

    response.setContentType("application/csv");

    PrintWriter dout = response.getWriter();

    while(rs.next()) {
     dout.print(data row);  // Here i am printing my ResultSet tubles into flat file.
     dout.print("\r\n");
     dout.flush();
}

3 个答案:

答案 0 :(得分:2)

OpenCSV将干净利落地处理CSV格式的怪癖,但是大型报告仍然是一份大型报告。看一下具体的内存错误,听起来你需要增加Heap或Max Perm Gen空间(这将取决于错误确定)。没有任何调整,JVM只会占用固定数量的RAM(我的经验是这个数字是64 MB)。

答案 1 :(得分:1)

如果您只将结果集中的数据流式传输到文件而不使用大缓冲区,那么这应该是可能的,但是您可能首先在发送到文件之前将数据收集在不断增长的列表中?所以你应该调查这个问题。

请更多地指出您的问题,否则我们必须推测。

答案 2 :(得分:0)

CSV格式不再受内存的限制 - 也许只有在预先填充CSV数据的过程中,这也可以有效地完成,例如使用例如LIMIT / OFFSET从DB查询行的子集并立即将其写入文件,而不是在写入任何行之前将整个数据库表内容拖入Java的内存中。一个“工作表”中行数量的Excel限制将增加到大约一百万。

大多数体面的数据库都有一个导出到CSV的功能,可以毫无效率地完成这项任务。在例如MySQL的情况下,您可以使用LOAD DATA INFILE命令。

相关问题