来自Blob的InputStream

时间:2013-03-12 12:59:19

标签: java performance streaming weblogic mtom

我有这样的场景,我需要将文件内容直接传输到客户端浏览器。

所以我使用普通的jdbc rs.getBlob()然后blob.getBinaryStream();写入http输出流。

我注意到(一件非常好的事情)是,一旦我通过blob获得输入流,db连接就会重新调整到数据源池。 (的WebLogic)

现在我问你,我的观察是正确的吗?因为我担心下载会花费很长时间,数据库连接将保留在请求中,以便能够传输文件。

显然,一旦开始流式传输,数据库连接就不再使用了。

将在这里模拟一些代码以便更好地理解

@Trasactional
public void InputStream getIsFromBlob(....){

 ....
is = blob.getBinaryStream();
...

return is;

}

稍后这个方法在servlet中使用,让我们说出来并写出http输出流的内容

由于

2 个答案:

答案 0 :(得分:0)

如果不仔细查看代码,我不会认为你认为是正确的。您必须专门关闭它才能关闭它(通常在finally块中),或者指定连接在数据库上的活动时间。 来自here:数据库服务器将超时并回收它。有关默认值以及如何更改,请参阅数据库服务器特定管理手册。在例如MySQL的情况下,它是wait_timeout设置,默认为28800秒(8小时)。

答案 1 :(得分:0)

你所说的是连接可以由容器自动关闭。当所有对连接的引用都消失后,连接将在垃圾回收期间返回到连接池。但是,这通常被认为是错误的编程实践,因为它通常是连接泄漏的主要原因。我建议你在最后一次阻止时不需要它来关闭连接。

对于你原来的问题,我会说你的观察是正确的。首先,您通过二进制输入流从blob中读取内容。此流式传输需要DB连接。但是在完成对inputstream的读取后,您不再需要DB连接。在您的情况下,该方法存在并且垃圾收集启动并将连接返回到池。稍后您通过HttpOutputStream将二进制内容流写入浏览器。此流式传输与DB无关。

同样,我强烈建议不要依赖垃圾收集来返回连接池的连接。