2016-02-09 110 views
2

SQLServerXADataSource接口的文檔說,它提供連接池,並且每當客戶端連接完成時,都應調用close()方法;在這種情況下,連接將不會關閉,而是返回到池中。我正在嘗試這一點,但下一次我試圖獲得連接,它說連接已經關閉。我怎樣才能使用這個接口實現連接池?使用SQLServerXADataSource連接池

,提供了連接類是:

public class ConnectionPool { 
    SQLServerXADataSource ds; 
    Decoder dec = Base64.getDecoder(); 
    Connection connection = null; 

    public ConnectionPool(InputStream inputStream) throws Exception { 
    ds = new SQLServerXADataSource(); 
    boolean res = Config.load(inputStream); 
    if (res) { 
     ds.setServerName(Config.SQL_SERVER()); 
     ds.setDatabaseName(Config.SQL_DB_NAME()); 
     ds.setIntegratedSecurity(Config.SQL_INTEGRATED_SECURITY()); 
     ds.setPortNumber(Config.SQL_PORT()); 
     if (!Config.SQL_INTEGRATED_SECURITY()) { 
      ds.setUser(Config.SQL_USERNAME()); 
      ds.setPassword(new String(dec.decode(Config.SQL_USER_PASSWORD()))); 
      } 
     } else { 
      throw new Exception("Failed to load parameters."); 
     } 
     connection = ds.getConnection(); 
    } 

    public Connection getConnection() throws SQLServerException { 
     return this.connection; 
    } 
} 

創建連接池(當用戶登錄)的對象後,我把它保存爲一個會話屬性,這樣的servlet可以當他們得到它需要它。

您能否提供一個利用此接口在Web應用程序中實現連接池的示例?我知道我做得不對,但無法弄清楚問題所在。

回答

2

您正在構造函數中創建一次連接。如果關閉此連接,則關閉此連接(即使物理句柄返回到連接池)。相反,你的getConnection方法應該這樣做:

public Connection getConnection() throws SQLServerException { 
    return ds.getConnection(); 
} 

或者更好的是:只要給訪問數據源本身,而不是引入不必要的包裝。

但據我所知SQLServerXADataSource而不是一個連接池。它是XA連接的工廠(在代碼示例中未使用),並且還擴展了SQLServerConnectionPoolDataSource(這是連接工廠,由連接池使用,由連接池而不是連接池本身)。

Java EE方法是定義一個JNDI數據源(可以使用SQLServerXADataSourceSQLServerConnectionPoolDataSource作爲其工廠),然後從JNDI注入(或獲取)該數據源。

0

數據庫可能會關閉連接,但這不是連接池的正確實現。如果您想了解更多關於連接池的信息,您可以閱讀commons-dbcp項目或c3p0。這裏是實現連接池的數據源的example