InputStream из BLOB-объекта

У меня есть сценарий, в котором мне нужно передать из БД содержимое файла непосредственно в клиентский браузер.

Поэтому я использую простой jdbc rs.getBlob(), а затем blob.getBinaryStream(); позже записываю в выходной поток http.

Что я заметил (очень хорошо), так это то, что как только я получаю входной поток через большой двоичный объект, соединение с базой данных перенастраивается на пул источников данных. (веблогика)

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

По-видимому, после запуска потоковой передачи соединение с БД больше не используется.

здесь будет макет кода для лучшего понимания

@Trasactional
public void InputStream getIsFromBlob(....){

 ....
is = blob.getBinaryStream();
...

return is;

}

Позже этот метод используется в сервлете, скажем, и пишет, что контекст находится в потоке вывода http.

Спасибо


person Cris    schedule 12.03.2013    source источник
comment
та же проблема forums.oracle.com/forums/thread.jspa?messageID=9492635   -  person Cris    schedule 13.03.2013


Ответы (2)


Не взглянув на код, я не думаю, что вы считаете правильным. Вы должны специально закрыть соединение, чтобы оно закрылось (обычно в блоке finally), или указать, как долго соединение может быть активным в базе данных. Из здесь: это сервер БД, который истечет время ожидания и вернет его. Обратитесь к руководству по администрированию конкретного сервера БД, чтобы узнать о значениях по умолчанию и о том, как их изменить. В случае, например, MySQL это параметр wait_timeout, который по умолчанию равен 28800 секунд (8 часов).

person happybuddha    schedule 12.03.2013
comment
Соединение автоматически закрывается контейнером (приложением jee), когда существует метод, и в результате передается входной поток - person Cris; 12.03.2013

То, что вы сказали, верно, что соединение может быть автоматически закрыто контейнером. Когда все ссылки на соединение удалены, соединение возвращается в пул соединений во время сборки мусора. Однако это обычно считается плохой практикой программирования, поскольку обычно является основной причиной утечки соединения. Я бы рекомендовал закрывать соединение всякий раз, когда оно вам не нужно, через блок finally.

На ваш первоначальный вопрос я бы сказал, что ваше наблюдение верно. Во-первых, вы читаете содержимое большого двоичного объекта через двоичный входной поток. Для этой потоковой передачи требуется подключение к БД. Но после того, как чтение из входного потока выполнено, вам больше не нужно подключение к БД. В вашем случае метод существует, и сборка мусора срабатывает и возвращает соединение обратно в пул. Позже вы записываете потоковое двоичное содержимое в свой браузер через HttpOutputStream. Эта потоковая передача не связана с БД.

Опять же, я настоятельно рекомендую не полагаться на сборку мусора для возврата соединений в пул соединений.

person Lan    schedule 12.03.2013
comment
Вероятно, я был недостаточно ясен... Мне не нужно совершать транзакцию, закрывать соединение и т. д. Это обрабатывается Spring (используется в контейнере jee). Все это делается прозрачно фреймворком. Я заметил, что соединение, используемое для получения большого двоичного объекта, возвращается в пул (через мониторинг консоли администратора), и для потоковой передачи содержимого большого двоичного объекта это соединение не требуется. - person Cris; 13.03.2013
comment
Когда все ссылки на соединение удалены, соединение возвращается в пул соединений во время сборки мусора. Это совершенно неправильно... соединение с мусором не имеет ничего общего с возвращением соединения в пул. Вызов close для свернутого соединения вернет соединение в пул. - person Cris; 13.03.2013
comment
У каждого контейнера может быть механизм для возврата утекшего соединения в пул... это другое - person Cris; 13.03.2013
comment
Пожалуйста, ознакомьтесь с docs.oracle.com/cd/E13222_01. /wls/docs81/faq/jdbc.html. По крайней мере, в Weblogic сборка мусора связана с возвратом соединения в пул согласно документации WLS. - person Lan; 13.03.2013
comment
Когда вы говорите о потоковой передаче содержимого большого двоичного объекта, вы имеете в виду потоковую запись в браузер или потоковое чтение из большого двоичного объекта? Есть два шага, основанные на моем понимании ваших шагов. - person Lan; 13.03.2013