Джерси - Возвращение потока из ResultSet - PullRequest
1 голос
/ 19 февраля 2012

У меня есть таблица с полем CLOB (MySQL MediumText).

Я хочу вернуть поток ввода в этот CLOB. Мой код ресурса выглядит так:

@GET
public StreamingOutput getAsStream(int id) {
  try {
    // prepare the statement object
    ResultSet rs = stmt.executeQuery();
    if (rs.next()) return new StreamingOutput() {
      public void write(OutputStream outputStream) throws ... {
        copy(rs.getBinaryStream(1), outputStream);
      }
    }
  }
  finally {
    rs.close();
    stmt.close();
    connection.close();
  }
}

Что выглядит не так. Код закрывает ресурсы базы данных (набор результатов, оператор и соединение), прежде чем Джерси сможет записать поток в ответ.

Я могу закрыть ресурсы БД в методе StreamingOutput.write. Но это также не правильно - я позволяю некоторому внешнему контейнеру закрыть мои ресурсы.

Последняя идея, которую я могу придумать, - это прочитать весь поток в память и затем отправить его. Я не хочу делать это, конечно.

Так, у кого-нибудь есть идеи получше?

Я проверил Вернуть файл, используя Java-Джерси , который не сильно помог.

Спасибо, Дорон

1 Ответ

0 голосов
/ 19 февраля 2012

Да, ваш код, как показано, не будет работать. Вы создали анонимный внутренний класс в своем методе, а затем передали его в качестве объекта возврата в контейнер. Объект write в новом классе фактически не вызывается до тех пор, пока ваш метод уже не завершится, и тогда вы, конечно, уже закроете все свои соединения.

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

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