在MVC中从模型层返回Java InputStream

在MVC中从模型层返回Java InputStream,java,servlets,model-view-controller,jdbc,inputstream,Java,Servlets,Model View Controller,Jdbc,Inputstream,我正在创建一个MVC web应用程序,其中用户下载一个100mb+的文件。该文件以块的形式存储在Oracle数据库中的多个BLOB中 假设您的模型中有一个名为File的类和一个HttpServletclassFileController 在文件中,我们有一个方法来获取从中读取文件的流。代码是这样的 ArrayList<InputStream> blobStreams = new ArrayList<InputStream>(); try {

我正在创建一个MVC web应用程序,其中用户下载一个100mb+的文件。该文件以块的形式存储在Oracle数据库中的多个BLOB中

假设您的模型中有一个名为
File
的类和一个
HttpServlet
class
FileController

在文件中,我们有一个方法来获取从中读取文件的流。代码是这样的

    ArrayList<InputStream> blobStreams = new ArrayList<InputStream>();
    try
    {
        //<set up and execute JDBC query here> 

        while (results.next())
        {
            blobStreams.add(results.getBinaryStream("blob"));
        }
        return new SequenceInputStream(Collections.enumeration(blobStreams));
    }
    catch (Exception e)
    {
        //<exception handling>
    }
    finally
    {
        try{if (results!=null)results.close(); }catch(Exception e){};
        try{if (statement!=null) statement.close();}catch(Exception e){};
        try{if (connection!=null) connection.close();}catch(Exception e){};
    }
我遇到了一个异常,“java.io.IOException:Closed Connection”,可能是因为JDBC对象在
文件的
finally
块中关闭了


MVC返回流而不过早关闭流的最佳方式是什么?

您可以将输出流传递到方法中,让服务层处理流,而不是从服务层返回输入流吗

大概是这样的:

public void getBlobs(OutputStream stream);
这样,一旦数据流化,服务本身就可以处理输出并正确地关闭连接,这也意味着服务的使用者不需要担心正确地缓冲数据

public void getBlobs(OutputStream stream);