Votre meilleur pari est de ne pas stockez les données dans la mémoire de Java de quelque manière que ce soit, mais écrivez simplement les données obtenues dans la réponse immédiatement au fur et à mesure que les données arrivent. Vous devez également configurer le pilote MySQL JDBC pour servir le jeu de résultats ligne par ligne en Statement#setFetchSize()
conformément à la documentation du pilote MySQL JDBC
, sinon il mettra le tout en cache en mémoire.
En supposant que vous connaissiez les servlets, voici un exemple de lancement qui tient compte de tout :
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) {}
}
}