【问题标题】:Spring MVC + Oracle LOBs + StreamingSpring MVC + Oracle LOB + 流式处理
【发布时间】:2011-01-05 04:23:00
【问题描述】:

我必须通过 ServletOutputStream 发送 blob 的二进制流。

我正在使用以下技术和软件:Oracle 11、WebSphere 7、Springframework 2.5.5、Hibernate 3.3.SP1。

有两个 Oracle 数据库。第一个包含用于描述我必须传输的文件的表格,第二个包含文件的内容。

我还在春季配置了对 WebSphere 和 JtaTransactionManager 中 XA 数据源的支持。

我在一次交易中获得对文档和内容本身的引用。

JDBC 规范告诉我们 LOB 是事务对象,可移植应用程序应该在事务中使用这些对象。

我有以下问题:

  1. 在事务方法中检索 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;
    }
  1. 如果 BLOB 的内容足够大并且应用服务器中预先配置了事务超时,如何将 BLOB 的二进制流传输给最终用户是不合法的?我是否必须手动处理事务并将超时设置为零(事务永远不会超时)?

  2. 在这种情况下,将 BLOB 的二进制流传输给最终用户的最佳方式是什么?

【问题讨论】:

    标签: java oracle spring streaming lob


    【解决方案1】:

    你说得对,从你的 tx 方法返回 BLOB 的流不是一个好主意......它可能在某些情况下工作,取决于数据库,但它是有风险的。

    解决办法是把问题从里到外翻出来。将 servlet 的 OutputStream 传递给您的事务方法。这避免了事务问题,并将您的流处理保持在一个地方:

    @Transactional
    public void getContent(Long docId, OutputStream outputStream) {
        Blob blob = getBlob(...);
        InputStream blobStream = blob.getBinaryStream();
        copy(blobStream, outputStream);
        blobStream.close(); // ignoring the usual stream closing try/catch stuff for brevity
    }
    

    public ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) {
       Long docId = ServlerRequestUtils.getRequiredLongParameter(req);
       service.getContent(docId, resp.getOutputStream());
       return null;
    }
    

    【讨论】:

    • 非常感谢,我做过类似的事情,现在我担心事务超时,特别是当用户的连接速度足够慢并且我必须传输的内容足够大时。将事务超时设置为“事务永不超时”是否可以?
    • 当然,这样做没问题
    • 再次感谢您帮助我们找到可接受的解决方案 :)
    猜你喜欢
    • 2014-11-07
    • 2010-09-07
    • 2018-07-17
    • 2019-03-03
    • 2012-08-17
    • 1970-01-01
    • 2015-09-20
    • 2014-05-30
    • 2014-11-10
    相关资源
    最近更新 更多