2012-01-21 50 views
2

我有一個主要的Servlet來處理post/get請求。
我使用連接池(在GlassFish v3的JDBC/MySQL的),我的servlet代碼是:
傳遞jdbc數據源v/s傳遞Connection對象 - 從servlet到java類

public class Controller extends HttpServlet { 
private DataSource datasource; 
@Override 
public void init() throws ServletException { 
     super.init(); 
    try { 
     //Database Connection pooling: 
     InitialContext ctx = new InitialContext(); 
     datasource = (DataSource)ctx.lookup("jdbc/MySQLPool"); 
     } 
     catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
private Connection getConnection() throws SQLException { 
    return datasource.getConnection(); 
    } 
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    Connection connection=null; 
    try { 
      connection = datasource.getConnection(); 
      Object obj= cmdFactory.getInstance().getCommand(Cmd).execute(connection); 
     } 

等...並在一個servlet的結束終於阻止我關閉連接

所以現在我在最後一行傳遞「connection」對象作爲參數,供其他(非servlet)java類通過應用程序的低層使用。這是錯的嗎?是不是更好地傳遞數據源對象(然後在特定的類中執行datasource.getConnection())?或者是否有類似的「getServletContext()。getAttr(database)」可用於其他java類來獲得此連接?

回答

3

DataSource允許從連接池中獲取JDBC連接,大部分時間。在一個servlet環境中,如果你連接到一個DataSource兩次,你會得到兩個不同的連接。

因此,傳遞數據源沒有意義:您希望調用鏈中的所有對象使用相同的連接,並在最後提交。

連接必須通過從DataSource獲取它的方法關閉,否則池將泄漏連接,並且您將很快用完可用連接。

+0

非常感謝:)而且是關於泄漏你是絕對正確的,謝謝你提醒我,因爲我已經忘記了它! – shadesco

+0

一個問題:你如何近似或計算,特定的Web應用程序的連接池大小應該是多少?是否有如下參考?這是我第一次使用連接池,我剛剛使用了glassfish的默認參數 – shadesco

+1

我依賴於併發用戶的數量,數據庫實際支持的連接數以及線程池中的線程數。您必須使用預期的併發用戶數來加載測試您的應用,並查看最佳數字是什麼。然後你必須驗證現實是否符合你的期望。 –