2013-10-08 220 views
-1

嗨,我想創建數據庫連接池。下面的方法是正確的。數據庫連接池

public Connection getMySQLConnection(){ 
      Connection conn = null; 

      String url = "jdbc:mysql://" + Config.getInstance().getProperty("DB_SERVER_HOST") + ":" + Config.getInstance().getProperty("DB_SERVER_PORT") + "/" + Config.getInstance().getProperty("DB_NAME"); 


      try { 
       poolConn = new DbPool("com.mysql.jdbc.Driver", url, Config.getInstance().getProperty("DB_USERNAME"), Config.getInstance().getProperty("DB_PASSWORD")); 
      } catch (SQLException e) { 
       LOGGER.error("error while creating the connection pool : "+e); 

      } 
      try { 
       conn = poolConn.getConnection(); 
      } catch (SQLException e) { 
       LOGGER.error("Error while getting connection from db pool"+e); 

      } 
      return conn; 
    } 

這是我的自定義DbPool類的構造函數。在上面的代碼中,我創建了這個類的對象。

public DbPool(String classname, String url, String username, 
      String password) throws java.sql.SQLException { 
     try { 
      Class.forName(classname).newInstance(); 
     } catch (Exception e) { // Catch any exception from JDBC driver failure 
      LOGGER.error("Failed to load JDBC driver: "+classname 
           +", Exception: "+e); 
     } 

     maxConnections = defaultMaxConnections; 
     timeout = defaultTimeout; 
     if (DEBUG) { 
      maxConnections = debugDefaultMaxConnections; 
      timeout = debugDefaultTimeout; 
     } 
     totalConnections = 0; 
     freeList = new java.util.LinkedList<DBPoolConnection>(); 
     busy = new java.util.HashMap<Connection, DBPoolConnection>(); 
     this.url = url; 
     connectionProperties = new java.util.Properties(); 
     if (username == null) LOGGER.info("ERROR: Null JDBC username"); 
     else connectionProperties.setProperty("user",username); 
     if (password == null) LOGGER.info("ERROR: Null JDBC password"); 
     else connectionProperties.setProperty("password",password); 
    } 
+0

什麼是'poolConn'? –

+1

爲什麼不使用ORM框架並讓它管理連接池?或使用已有的 - (BoneCP)http://jolbox.com/例如 – hovanessyan

+0

爲什麼不簡單試一試,看看它是否有效?請更具體地說明您的實際問題(如果有的話...)。 – dirkk

回答

1

完全錯誤。爲什麼每次調用getMySQLConnection方法時都會創建池。池應該創建一次,並且在調用getMySQLConnection時,從池中獲取連接並檢查連接是否有效,然後返回連接。

使用諸如boneCP,DBCP,C3P0等第三方連接池而不是自己寫一個是明智的。參數

地塊已創建連接池

+0

如果我們可以創建自己的代碼,那麼爲什麼我們總是應該使用第三方API。 ??? – Dharm

+1

那麼你可以,但是創建一個並且太合適,需要很長時間。連接是最重要的資源之一。這些資源管理不善可能是一個很大的問題。沒有人有時間創建自己的連接池來構建應用程序。他們傾向於使用流行的,並專注於構建應用程序。如果您的目標是創建一個不同的池,請繼續,否則我的建議是使用第三方連接池。 –

1

Pascal Thivent之前被認爲是寫在Need Code to create Connection Pool in java

需要代碼來創建Java中的連接池?

不知道是什麼的問題是,但不創建另一個連接 池,使用像C3P0,Apache的DBCP,Proxool的或 BoneCP(在該領域的一個新的播放器)現有的解決方案。我會使用C3P0。

我們如何確保連接池不返回已經在使用的同一個對象?

因爲如果一個連接已經從池借用的,而不是 還沒有恢復,它只是沒有在游泳池,不能分配給 池的另一端(資源從池中刪除,直到 他們被退回)。

如果客戶端從連接池中取出連接後關閉連接,會發生什麼情況?

從池中客戶端獲取連接是不是一個真正的 java.sql.Connection中,它是一個 java.sql.Connection中是定製的一些方法的行爲的包裝(代理)。 close()方法就是其中之一,並且不會關閉連接 實例,但會將其返回到池。

也赤此link