我有一个要求,只能从localhost访问mysql数据库.我必须实现一个访问数据库的servlet,允许该系统中的其他服务器访问数据(servlet将作为代理工作).但是,该系统由一个远程服务器组成,该服务器下载执行语句的大部分数据,如:
select * from database limit 100;
有人可以建议我如何编写一个能够以有效的方式传输这些数据的servlet(我是数据库新手)吗?
解决方法:
首先,我不建议使用servlet.请参阅aioobe和mdma的答案以获得正确的方法.但如果真的没有其他选择,那么继续阅读:
只需在数据进入时立即将数据写入响应.不要将所有内容存储在Java的内存中.所以基本上:writer.write(resultSet.getString(“col”)).此外,MysqL JDBC驱动程序默认会在向ResultSet#next()提供任何内容之前缓存Java内存中的所有内容.您希望通过按照MySQL JDBC driver documentation设置Statement#setFetchSize()
来逐行提供数据.
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) {}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。