2013-03-12 66 views
0

我有這種情況,我需要從數據庫直接將文件內容流到客戶端瀏覽器。Blob的InputStream

因此,我使用普通jdbc rs.getBlob(),然後blob.getBinaryStream();稍後寫入http輸出流。

我注意到(一件很好的事情)是,一旦我通過blob輸入流,數據庫連接就會重新連接到數據源池。 (weblogic)

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

顯然,一旦流式傳輸開始,數據庫連接不再使用。

將在這裏實體模型的一些代碼,以便更好地理解

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

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

return is; 

} 

後來在一個servlet用這個方法讓我們說和寫contect的是在HTTP的OutputStream

感謝

+0

同樣的問題https://forums.oracle.com/forums/thread.jspa?messageID=9492635 – Cris 2013-03-13 09:21:15

回答

0

沒有一個偷看代碼,我不認爲你的想法是正確的。您必須特別關閉連接才能關閉連接(通常在finally塊中),或者指定連接在數據庫上可以處於活動狀態的時間。 從here:這是數據庫服務器誰將超時並回收它。請參閱數據庫服務器特定管理手冊以瞭解默認值以及如何更改它。例如,MySQL的wait_timeout設置默認爲28800秒(8小時)。

+0

當容器(jee app)存在該方法並且作爲結果傳遞給輸入流時,連接會自動關閉 – Cris 2013-03-12 13:29:16

0

你說的是對的,連接可以被容器自動關閉。當連接的所有引用都不存在時,連接在垃圾回收期間返回到連接池。但是,這通常被認爲是不好的編程習慣,因爲它通常是連接泄漏的主要原因。我會建議關閉連接,只要你不需要通過finally塊。

對你原來的問題,我會說你的觀察是正確的。首先,您通過二進制輸入流從blob中讀取內容。此流媒體需要數據庫連接。但是在從inputstream讀取完成後,您不再需要數據庫連接。在你的情況下,該方法存在並且垃圾收集會踢入並將連接返回到池中。稍後,通過HttpOutputStream將二進制內容流式傳輸到瀏覽器。此流媒體與數據庫無關。

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

+0

大概我還不夠清楚......我不需要提交事務,關閉連接等等。這是由Spring處理的(用在jee容器中)。它全部都是透過框架完成的。我注意到的是用於獲取blob的連接返回到池(通過監視管理控制檯)並且流式傳輸blob的內容不需要此連接 – Cris 2013-03-13 06:45:18

+0

「當連接的所有引用都不存在時,連接將返回到垃圾收集期間的連接池「這完全是錯誤的......垃圾連接與此無關將連接返回到池。在wrpped連接上調用關閉會將連接返回到池。 – Cris 2013-03-13 07:11:37

+0

每個容器都可能有一個機制將泄漏的連接返回到池中......不同 – Cris 2013-03-13 07:12:11