Đặt cược tốt nhất của bạn là không lưu trữ dữ liệu trong bộ nhớ của Java theo bất kỳ cách nào, nhưng chỉ cần ghi dữ liệu thu được vào phản hồi ngay lập tức khi dữ liệu đi vào. Bạn cũng cần định cấu hình trình điều khiển MySQL JDBC để phân phát tập kết quả theo từng hàng của Statement#setFetchSize()
theo tài liệu trình điều khiển MySQL JDBC
, nếu không, nó sẽ lưu toàn bộ nội dung vào bộ nhớ.
Giả sử bạn đã quen thuộc với Servlets, đây là một ví dụ khởi động có tính đến tất cả điều đó:
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) {}
}
}