我有一个场景,我需要从DB将文件的内容直接流式传输到客户端浏览器。
所以我使用普通的jdbc rs.getBlob()
然后blob.getBinaryStream();
写入http输出流。
我注意到(一件非常好的事情)是,一旦我通过blob获得了输入流,数据库连接就返回到数据源池。(应用服务器)
现在我问你,我的观察是否正确?因为我担心下载需要很长时间,db连接将停留在请求上,以便能够流式传输文件。显然,一旦流启动,DB连接就不再使用了。
为了更好地理解 ,将在这里模拟一些代码
@Trasactional
public void InputStream getIsFromBlob(....){
....
is = blob.getBinaryStream();
...
return is;
}
之后,这个方法在servlet中使用,比如在http输出流中编写它的内容
谢谢
不看一下代码,我认为你的想法是不对的。您必须明确地关闭连接才能关闭它(通常在finally块中),或者指定连接在数据库上可以活动多长时间。从这里开始:DB服务器将超时并回收它。有关默认值以及如何更改它,请参阅DB服务器特定的管理手册。以MySQL为例,它的wait_timeout设置默认为28800秒(8小时)。
你说的是真的,连接可以被容器自动关闭。当对连接的所有引用都消失时,在垃圾收集期间将连接返回到连接池。然而,这通常被认为是糟糕的编程实践,因为它通常是导致连接泄漏的主要原因。我建议当你在finally block中不需要连接时关闭它。
对于你最初的问题,我认为你的观察是正确的。首先,通过二进制输入流从blob读取内容。此流需要DB连接。但是在完成从输入流的读取之后,您就不再需要DB连接了。在您的示例中,该方法存在,垃圾收集启动并将连接返回到池中。稍后,通过HttpOutputStream将二进制内容流写入浏览器。这个流与DB无关。再次强调,我强烈建议不要依赖垃圾收集将连接返回到连接池。