我在struts應用程序中使用連接池與SharedPoolDataSource。應用程序用戶通過用戶界面動態傳遞連接參數。我創建了DriverAdapterCPDS的對象,並將它分配給SharedPoolDataSource obj道具。連接池顯示數據庫中的INACTIVE連接
SharedPoolDataSource tds = new SharedPoolDataSource();
tds.setConnectionPoolDataSource(cpds);
tds.setMaxActive(5);
tds.setMaxIdle(2);
tds.setMaxWait(50);
tds.setTestOnBorrow(true);
tds.setValidationQuery(validationQuery);
我將它存儲在DBUtil類的哈希表中,公司名稱作爲關鍵字。像這個應用程序用戶分配很多與每個公司相關的數據庫詳細信息。
dbUtil.DSht.put(comp, tds);
從另一個程序(Swing App)用戶發送公司名稱。所以我需要獲取公司的數據源對象,並在該數據庫上執行分配給用戶的查詢。並將結果作爲對象返回。
所以,我這樣寫
public static Connection getClientConnection(String comp){
Connection con = null;
try{
if(!dbUtil.DSht.contains(comp)){
loadClientDataSource(comp);
}
DataSource ds = (DataSource)dbUtil.DSht.get(comp);
Idle:"+bds.getNumIdle());
con = ds.getConnection();
}catch(Exception e){
e.printStackTrace();
throw new DBUtilException("Unable to get the client connection object. Cause: "+e.getMessage());
}
return con;
}
功能關閉數據庫連接
public static void closeConnection(Connection con){
try{
if(con != null)
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
我打電話這個closeConnection功能finally塊
try{
con = DBUtil.getClientConnection(comp);
pstmt = con.prepareStatement(sqlQuery);
pstmt.executeQuery();
}catch(SQLException sqle) {
sqle.printStackTrace();
throw new QueryException("Unable to add query. Cause: "+sqle.getMessage());
}finally{
DBUtil.closeStatement(pstmt);
DBUtil.closeConnection(con);
}
是有沒有使用conn的問題彙集。使用這個應用程序數據庫後顯示很多INACTIVE連接關聯到我的電腦。即使在關閉連接後,它也是如此。我只爲數據庫設置了2個MAXIDLE連接。問題是什麼。爲什麼它顯示了很多INACTIVE連接。如果我們把數據源放在哈希表中,是否有任何問題。
請幫幫我。
感謝您的快速回復,我應該怎麼知道我可以通過Java持有的連接? –
這取決於您的連接池配置,應用程序連接的使用情況以及會話參數,例如會話的最長非活動時間。 – Adi
我在getConnection()方法中從hashtable獲取數據源時發現問題。它應該是dbUtil.DSht.containsKey(compcode)而不是dbUtil.DSht.contains(compcode)。 –