2012-03-15 54 views
1

我正在創建Connection對象並在類(DbTest)的構造函數中創建jdbc連接。會話過期時關閉jdbc連接對象

在另一個Java類(RequestFilter.java)

然後,我這個對象的初始化和存儲在HTTP會話這個實例對象,

DbTest dbtest = new DbTest(); 
session.setAttribute("dbtest", dbtest); 

我的問題是,有沒有辦法關閉連接對象會話過期時創建了嗎?或者它會在到期時自動關閉?

回答

4

您可以實施HttpSessionListener並在sessionDestroyed()方法內進行清理。然而你的架構讓我感到擔憂。您不應該在HTTP會話中存儲原始JDBC連接!

  • 你不能HTTP會話遷移到另一臺服務器

  • 您可以輕鬆創建成千上萬打開的數據庫連接,HTTP會話是更輕便

  • 的99.9%的時間你的數據庫連接空閒

  • 你不大可能處理連接超時和其他故障

有每個用戶連接而不是連接池的原因嗎?

+0

我明白了。 Plz在下面的鏈接中詳細說明了我的問題,因爲我無法在本文的評論部分添加足夠的內容,http://stackoverflow.com/questions/9723270/making-jdbc-connection-and-storing-in-session – 2012-03-15 15:51:39

0

你可以實現HttpSessionBindingListener。

+0

'HttpSessionBindingListener':*使對象在與會話綁定或解除綁定時得到通知*。 OP希望在會話到期時得到通知*。 'HttpSessionListener'是一個更好的選擇。 – 2012-03-15 13:42:07

+0

使對象在與會話綁定或解除綁定時收到通知。該對象由HttpSessionBindingEvent對象通知。這可能是由於servlet程序員顯式地從會話中解除了某個屬性的結果,這是由於會話失效或由於會話超時而造成的。 – cjstehno 2012-03-15 16:58:08

0

您需要顯式關閉連接對象。您可以在finalize方法中關閉集合,但不建議這樣做,因爲可能不會調用finalize。更好的方法是編寫和調用將顯式關閉此連接的方法。也不建議在構造函數中創建JDBC連接。

0

管理連接池,也可能是一個問題。要從連接池獲得連接,您需要使用同步,這可以防止其他線程(客戶端)訪問連接池。

相關問題