2013-05-07 204 views
7

參考Tomcat JBDC connection pool,我看到在那裏給出的獨立java示例中,有一個使用datasource.getConnection()這個很酷的連接。但在最後一塊,它說con.close()Tomcat JDBC連接池(釋放連接)

問題:當我實現這個時,似乎很明顯,我從數據源獲得的con將在每次最後關閉。當它關閉時,連接池機制會獲得一個新連接並將其添加到池中?

我認爲應該有一個像releaseConnection()這樣的方法調用,它可以讓游泳池自己決定是關閉它還是讓它爲其他用途打開。

我也試過這樣做ConnectionPool aPool = datasource.createPool(); 但我看到有沒有像這個aPool發佈連接。

我想我在這裏失去了一些東西? 感謝您的幫助。從Tomcat JBDC connection pool

代碼片段:

  DataSource datasource = new DataSource(); 
      datasource.setPoolProperties(p); 

      Connection con = null; 
      try { 
       con = datasource.getConnection(); 
       Statement st = con.createStatement(); 
       ResultSet rs = st.executeQuery("select * from user"); 
       int cnt = 1; 
       while (rs.next()) { 
        System.out.println((cnt++)+". Host:" +rs.getString("Host")+ 
        " User:"+rs.getString("User")+" Password:"+rs.getString("Password")); 
       } 
       rs.close(); 
       st.close(); 
      } finally { 
       if (con!=null) try {con.close();}catch (Exception ignore) {} 
      } 

回答

7

既然你調用了關於池獲得的方法的close()函數,那麼這個方法調用內部要做些什麼。它不一定需要關閉池式數據庫連接 - 它可能會進行一些清理,然後將連接添加回池中。

這在Closing JDBC Connections in Pool

+0

保持DataSource的「MaxIdle」設置足夠高,以使這些連接不被關閉。將它設置爲0會關閉任何關閉的連接,我想。 – Hartmut 2014-09-07 20:36:25

2

這個例子只能說明how to create and use a data source。對於Tomcat上的連接池,您可以配置JNDI

// Sample 
public static Connection getConnectionFromPool() { 
    Context initCtx = new InitialContext(); 
    Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
    DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB"); 
    return ds.getConnection(); 
    ... 

How connection pooling works in Java and JDBC引用:

連接池通過執行提前創建 連接,在一個JDBC連接池的情況下的工作操作時,被創建的連接對象的 池在應用程序 服務器(或某個其他服務器)啓動時。這些對象隨後由池管理器管理 ,池管理器在客戶端請求 客戶端時分散連接,並在確定客戶端使用Connection對象完成了 後將其返回給池。管理這些連接涉及很多家務活動,其中包括 。

當連接池服務器啓動時,它創建一個預定的 數量的Connection對象。然後,客戶端應用程序將執行 JNDI查找以檢索對DataSource對象的引用,該對象實現ConnectionPoolDataSource接口。客戶端 應用程序將不需要做任何特殊的規定來使用 彙集的數據源;代碼將與針對非池化數據源編寫的代碼 沒有區別。

3

OK,我的壞已經回答了,我沒有看到DataSource實施。 它擴展DataSourceProxy那久違基礎上,PoolProperties

我明白Connection之前在內部創建一個池,其高達這個數據源來處理連接,即使我在最後關閉con,數據源可以採取必要的行動。

請不要添加評論/回覆,如果有人認爲不然。