Мне нужно отправить двоичный поток блоба с помощью ServletOutputStream.
Я использую следующие технологии и программное обеспечение: Oracle 11, WebSphere 7, Springframework 2.5.5, Hibernate 3.3.SP1.
Есть две базы данных Oracle. Первый содержит таблицы для описания документов, которые я должен передать, а второй - содержание документов.
Я также настроил поддержку источников данных XA в WebSphere и JtaTransactionManager весной.
Я получаю ссылку на документ и сам контент в одной транзакции.
В спецификации JDBC говорится, что большие объекты являются транзакционными объектами, и переносимые приложения должны использовать такие объекты в транзакциях.
И у меня есть следующие вопросы:
- Законно ли получать входной поток BLOB внутри транзакционного метода и передавать его нетранзакционному методу верхнего уровня? Примерно так:
@Transactional
public InputStream getContent(Long docId) {
Blob blob = getBlob(...);
return blob.getBinaryStream();
}
public ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) {
Long docId = ServlerRequestUtils.getRequiredLongParameter(req);
InputStream is = service.getContent(docId);
copy(is, resp.getOutputStream());
return null;
}
Если это недопустимо, как передать двоичный поток BLOB конечному пользователю, если содержимое BLOB достаточно велико и на сервере приложений предварительно настроено время ожидания транзакции? Нужно ли обрабатывать транзакции вручную и устанавливать время ожидания равным нулю (транзакция никогда не прекращается)?
Каков наилучший способ передачи двоичного потока BLOB конечному пользователю в таком случае?