最好的选择是 不要 以任何方式将数据存储在Java内存中,而只是在数据进入时 立即 将获取的数据写入响应中。您还需要配置MySQL
JDBC驱动程序以逐行提供结果集通过
Statement#setFetchSize()为每MySQL
JDBC驱动程序文件,否则将缓存整个事情的记忆。
假设您熟悉Servlet,这是一个启动示例,其中考虑了所有方面:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); response.setHeader("Content-Disposition", "attachment;filename=numbers.txt"); // Force download popup. Connection connection = null; Statement statement = null; ResultSet resultSet = null; Writer writer = response.getWriter(); try { connection = database.getConnection(); statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); statement.setFetchSize(Integer.MIN_VALUE); resultSet = statement.executeQuery("SELECt number FROM phonenumbers"); while (resultSet.next()) { writer.write(resultSet.getString("number")); if (!resultSet.isLast()) { writer.write(","); } } } catch (SQLException e) { throw new ServletException("Query failed!", e); } finally { if (resultSet != null) try { resultSet.close; } catch (SQLException logOrIgnore) {} if (statement != null) try { statement.close; } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close; } catch (SQLException logOrIgnore) {} }}


