我在struts应用程序中使用连接池与SharedPoolDataSource。应用程序用户通过用户界面动态传递连接参数。我正在创建DriverAdapterCPDS的对象,并将其分配给SharedPoolDataSource obj props。
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);
}
使用连接池有问题吗?使用此应用程序后,数据库显示大量的非活动连接关联到我的计算机。即使在关闭连接后,它也是这样显示的。我为数据库设置了2个MAXIDLE连接。
有什么问题吗?为什么它显示了大量的非活动连接?如果我们把数据源放到哈希表中会有问题吗?
不用担心,会话处于INACTIVE状态并不是异常。查看http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:914029001168