【发布时间】:2011-09-08 06:34:08
【问题描述】:
我在 struts 应用程序中使用带有 SharedPoolDataSource 的连接池。应用程序用户通过用户界面动态传递连接参数。我正在创建 DriverAdapterCPDS 的对象并将其分配给 SharedPoolDataSource obj 道具。
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();
}
}
我在 finally 块中调用了这个 closeConnection 函数
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);
}
使用连接池有什么问题吗?使用此应用程序数据库后,显示很多 INACTIVE 连接到我的计算机。即使关闭连接后,它也显示为这样。我只为数据库设置了 2 个 MAXIDLE 连接。
有什么问题?为什么它显示了那么多 INACTIVE 连接?把datasource放到hashtable里会不会有问题?
【问题讨论】:
标签: java hashtable datasource connection-pooling