Først og fremmest anbefaler jeg ikke at bruge en servlet til dette. Se svarene fra aioobe og mdma for den rigtige tilgang. Men hvis der virkelig ikke er nogen anden mulighed, så fortsæt med at læse:
Bare skriv dataene til svaret med det samme efterhånden som dataene kommer ind. Gem ikke alt i Javas hukommelse. Så grundlæggende:writer.write(resultSet.getString("col"))
. Ydermere vil MySQL JDBC-driveren som standard cache alt i Javas hukommelse, før den giver noget til ResultSet#next()
. Du vil gerne lade den give dataene med det samme række for række ved at indstille Statement#setFetchSize()
i henhold til MySQL JDBC-driverdokumentationen
.
Her er et kickoff-eksempel, forudsat at du gerne vil udlæse dataene i CSV-format:
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) {}
}
}