Доступ к данным из сервлета - PullRequest
4 голосов
/ 11 августа 2010

У меня есть требование, что база данных mysql может быть доступна только с localhost. Я должен реализовать сервлет, который будет обращаться к базе данных, позволяя другим серверам в этой системе получать доступ к данным (сервлет будет работать как прокси). Однако эта система состоит из удаленного сервера, который загружает большие порции данных, выполняя оператор, такой как:

select * from database limit 100;

Может кто-нибудь предложить мне, как написать сервлет, который бы эффективно передавал такие данные (я новичок в базах данных)?

Ответы [ 3 ]

2 голосов
/ 11 августа 2010

Прежде всего, я не рекомендую использовать для этого сервлет. Смотрите ответы aioobe и mdma для правильного подхода. Но если другого варианта нет, продолжайте читать:


Просто запишите данные в ответ немедленно по мере поступления данных. Не храните все в памяти Java. Итак, в основном: writer.write(resultSet.getString("col")). Кроме того, драйвер JDBC MySQL по умолчанию будет кэшировать все, что находится в памяти Java, перед тем, как передать что-либо ResultSet#next(). Вы бы хотели, чтобы он давал данные сразу построчно, устанавливая Statement#setFetchSize() согласно документации драйвера JDBC MySQL .

Вот начальный пример, если вы хотите вывести данные в формате 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 голос
/ 11 августа 2010

Прокси-сервер JDBC даст вам то, что вы ищете из коробки, например Виртуальный JDBC .

1 голос
/ 11 августа 2010

Что ж, если ваша цель - полностью открыть sql-сервер для запросов от внешних хостов, но по какой-то причине не хотите перенастраивать его для приема внешних соединений, я бы предложил вам просто настроить туннель для порт, который прослушивает сервер.

Удаленный хост будет подключаться к вашему приложению (запущенному на localhost), которое, в свою очередь, просто подключается к sql-серверу и ретранслирует поток данных туда и обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...