우선 서블릿을 사용하지 않는 것이 좋습니다. 올바른 접근 방법은 aioobe 및 mdma의 대답을 참조하십시오. 정말 다른 선택이없는 경우, 그때 계속 읽기 :
그냥 응답
데이터에 오는대로 즉시에 데이터를 기록 자바의 메모리의 모든 내용을 저장하지 마십시오.. 그래서 기본적으로 :
writer.write(resultSet.getString("col"))
. 더구나, MySQL JDBC 드라이버는 기본적으로 무엇이든을
ResultSet#next()
에주기 전에 Java 메모리에있는 모든 것을 캐시합니다.
MySQL JDBC driver documentation에 따라
Statement#setFetchSize()
을 설정하여 데이터를 즉시 행별로 전달할 수 있습니다. 여기
는 출력 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) {}
}
}
이 가장 간단한 솔루션입니다; 데이터베이스의 기본 통신 방법을 사용하면 서블릿/http 응답을 통해 모든 것을 실행하는 것보다 오랜 시간이 걸릴 것 같습니다 –