首先,我不建议为此使用servlet。有关正确的方法,请参见aioobe和mdma的答案。但是,如果真的没有其他选择,请继续阅读:
只需在数据输入时 立即
将数据写入响应即可。不要将所有内容都存储在Java的内存中。所以基本上:
writer.write(resultSet.getString("col"))。此外,默认情况下,MySQLJDBC驱动程序将所有内容缓存在Java内存中,然后再提供给
ResultSet#next()。您希望通过
Statement#setFetchSize()按照MySQL
JDBC驱动程序文档设置来逐行立即为数据提供数据。
这是一个启动示例,假设您想以CSV格式输出数据:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/csv"); Connection connection = null; Statement statement = null; ResultSet resultSet = null; PrintWriter 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 col1, col2, col3 FROM tbl"); while (resultSet.next()) { writer.append(resultSet.getString("col1")).append(','); writer.append(resultSet.getString("col2")).append(','); writer.append(resultSet.getString("col3")).println(); // PS: don't forget to sanitize quotes/commas as per RFC4130. } } 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) {} }}


