从servlet访问数据

时间:2010-08-11 13:09:00

标签: java mysql servlets jdbc

我要求只能从localhost访问mysql数据库。我必须实现一个访问数据库的servlet,允许该系统中的其他服务器访问数据(servlet将作为代理工作)。但是,该系统由一个远程服务器组成,该服务器下载执行语句的大部分数据,如:

select * from database limit 100;

有人可以建议我如何编写一个能够以有效的方式传输这些数据的servlet(我是数据库新手)吗?

3 个答案:

答案 0 :(得分:2)

首先,我不建议使用servlet。请参阅aioobe和mdma的答案以获得正确的方法。但如果真的没有其他选择,那么继续阅读:


当数据进入时,只需将数据写入响应立即。不要将所有内容存储在Java的内存中。所以基本上:writer.write(resultSet.getString("col"))。此外,MySQL JDBC驱动程序默认会在向ResultSet#next()提供任何内容之前缓存Java内存中的所有内容。您希望通过按Statement#setFetchSize()设置MySQL JDBC driver documentation来逐行提供数据。

这是一个启动示例,假设您想以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) {}
    }
}

答案 1 :(得分:1)

好吧,如果您的目标是完全打开外部主机查询的sql-server,但出于某种原因不想重新配置它以接受外部连接,我建议你只需设置一个隧道服务器侦听的端口。

远程主机将连接到您的应用程序(在localhost上运行),而后者只是连接到sql-server并来回传递数据流。

答案 2 :(得分:1)

JDBC代理可以为您提供开箱即用的内容,例如Virtual JDBC