सबसे पहले, मैं इसके लिए सर्वलेट का उपयोग करने की अनुशंसा नहीं करता हूं। सही दृष्टिकोण के लिए aioobe और mdma के उत्तर देखें। लेकिन अगर वास्तव में कोई दूसरा विकल्प नहीं है, तो पढ़ना जारी रखें:
प्रतिक्रिया के लिए बस डेटा लिखें तुरंत जैसे ही डेटा आता है। जावा की मेमोरी में सब कुछ स्टोर न करें। तो मूल रूप से:writer.write(resultSet.getString("col"))
. इसके अलावा, MySQL JDBC ड्राइवर ResultSet#next()
को कुछ भी देने से पहले जावा की मेमोरी में डिफ़ॉल्ट रूप से सब कुछ कैश कर देगा। . आप इसे Statement#setFetchSize()
MySQL JDBC ड्राइवर प्रलेखन के अनुसार
।
यह मानते हुए कि आप डेटा को 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) {}
}
}