0

我有一个场景,我需要将文件的内容从 DB 直接流式传输到客户端浏览器。

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

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

现在我问你,我的观察是否正确?因为我担心对于需要很长时间的下载,数据库连接将停留在请求上以便能够流式传输文件。

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

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

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

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

return is;

}

后来这个方法被用在一个servlet中,比如说在http输出流中写下is的contect

谢谢

4

2 回答 2

0

如果不看代码,我认为您的想法是不正确的。您必须专门关闭连接才能关闭(通常在 finally 块中),或指定连接在数据库上可以活动多长时间。从 这里开始:数据库服务器将超时并回收它。有关默认值以及如何更改它,请参阅 DB 服务器特定的管理手册。例如 MySQL,它的 wait_timeout 设置默认为 28800 秒(8 小时)。

于 2013-03-12T13:22:00.730 回答
0

你说的是真的,连接可以被容器自动关闭。当对一个连接的所有引用都消失时,垃圾回收期间该连接将返回到连接池。但是,这通常被认为是不好的编程习惯,因为它通常是连接泄漏的主要原因。我建议您在不需要时通过 finally 块关闭连接。

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

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

于 2013-03-12T19:44:04.947 回答