簡體   English   中英

來自Blob的InputStream

[英]InputStream from Blob

在這種情況下,我需要從DB流式傳輸文件的內容直接到客戶端瀏覽器。

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

我注意到的一件非常棒的事情是,一旦我通過blob獲得了輸入流,數據庫連接就會重新調整到數據源池中。 (網絡邏輯)

現在我問你,我的觀察是正確的嗎? 因為我擔心對於需要很長時間的下載,數據庫連接將停留在請求中,以便能夠流式傳輸文件。

顯然,一旦開始流式傳輸,就不再使用DB連接。

將在此處模擬一些代碼以更好地理解

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

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

return is;

}

稍后在servlet中使用此方法,假設在http輸出流中寫入的內容

謝謝

如果不看代碼,我認為您認為不正確。 您必須專門關閉連接以使其關閉(通常在finally塊中),或指定連接在數據庫上可以激活的時間。 這里開始 :將是DB服務器超時並回收它。 有關缺省值以及如何更改缺省值,請參閱數據庫服務器特定的管理手冊。 以MySQL為例,它的wait_timeout設置默認為28800秒(8小時)。

您所說的是正確的,容器可以自動關閉連接。 當所有對連接的引用都消失了時,在垃圾回收期間,該連接將返回到連接池。 但是,這通常被認為是不良的編程習慣,因為它通常是導致連接泄漏的主要原因。 我建議您通過finally塊關閉不需要的連接。

對於您最初的問題,我想說您的觀察是正確的。 首先,您通過二進制輸入流從Blob中讀取內容。 這種流傳輸需要數據庫連接。 但是,完成從inputstream的讀取之后,您不再需要DB連接。 在您的情況下,該方法存在,並且垃圾回收開始,並將連接返回到池中。 稍后,您將通過HttpOutputStream將二進制內容流式傳輸到瀏覽器。 此流與數據庫無關。

再次,我強烈建議不要依賴垃圾回收將連接返回到連接池。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM