2015-08-27 39 views
1

我正在使用BoneCp連接池。我有一個問題,即在哪裏指定JDBC連接對象,以便它不應該給ResultSet關閉或Connection關閉等錯誤。在哪裏定義servlet中的Connection,Statement,ResultSet

我做的,如下圖所示:(代碼段)

  public Class GetTable extends HttpServlet { 
       Connection con = null;       
       Statement stmt = null; 
       ResultSet rs = null; 
      protected void doPost(HttpServletRequest req,HttpServletResponse res) 
       { 
       con = ConnectionManager.getConnectionPool().getConnection();  
       //initializing stmt,rs 
       //close con,stmt,rs using try and catch 
       }  

      } 

這是很好的方式,或者有定義所有JDBC裏面doPost對象?

對於每個請求創建一個新的servlet實例,那麼我如何管理JDBC對象沒有錯誤。

+0

相關/重複:http://stackoverflow.com/q/3106452 – BalusC

回答

0

不,這不是一個好方法。

您正在使用實例變量,並且使用相同的servlet對象來提供所有到該servlet的請求。因此,如果請求1進入,它將打開一個連接並將其分配給實例變量conn

同時,請求2進來,並且因此也將打開連接並將其分配給相同的conn變量。請求1將因此開始使用爲請求2打開的連接。當請求1結束時,它將(希望)關閉連接,這將因此也關閉請求2使用的連接。

這些全部應該是本地變量。

+0

因此,實例僅爲doPost方法創建,而不是整個servlet。我對嗎? –

+0

在這兩種情況下,都會創建一個實例。不同之處在於,如果使用局部變量,兩個線程將不會共享相同的變量,並且不會在彼此的腳趾上工作。因爲每個方法調用都有自己的局部變量,所以不會與任何其他方法調用共享。 –

0

最好使用單例連接工廠類來服務連接。 而且在java 8之後,如果你打開conneciton裏面的try(...)它會在try塊結束後關閉你的連接。