Мне нужно отправить двоичный поток большого двоичного объекта с помощью 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 конечному пользователю?