Най-добрият ви залог е да не съхранявайте данните в паметта на Java по какъвто и да е начин, но просто запишете получените данни в отговора незабавно при постъпване на данните. Вие също трябва да конфигурирате MySQL JDBC драйвера да обслужва набора от резултати ред по ред от Statement#setFetchSize()
съгласно документацията на MySQL JDBC драйвер
, в противен случай ще кешира цялото нещо в паметта.
Ако приемем, че сте запознати със Servlets, ето един начален пример, който взема предвид всичко това:
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) {}
}
}