java - Spring MVC + Oracle LOB + 流式处理

标签 java oracle spring streaming lob

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

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

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

我还在 spring 中配置了对 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 的二进制流传输给最终用户的最佳方式是什么?

最佳答案

你是对的,从你的 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;
}

关于java - Spring MVC + Oracle LOB + 流式处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066073/

相关文章:

sql - 如何在 Oracle 中转义单引号?

java - Hibernate 不将架构包含到查询中

java - 在 Spring Junit 测试中使用不同的 Auth 模型

java - 基本实体上的 Hibernate manyToOne 过滤器

java - 如何使用 Jsoup 将数据发布到网站

java - 如何将 getRealPath ("/") 路径从 .metadata 更改为 WEB-INF

spring - 将 GWT 与 Spring Security 框架集成

java - 为什么 JDK 源代码(src.zip)不包含运行时 jar(rt.jar)中的所有类

Oracle 中的 SQL 枢轴查询

java - @RequestMapping未获取参数和值。Spring框架