我在struts应用程序中使用与 SharedPoolDataSource 的连接池。应用程序用户通过用户界面动态传递Connection参数。我正在创建 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类的哈希表中,公司名称为key。像这个应用程序用户分配了与每个公司相关的大量数据库详细信息。
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 连接。如果我们将数据源放在哈希表中,是否有任何问题。
请帮帮我。
答案 0 :(得分:1)
不要担心,在INACTIVE状态下进行会话并不是一个异常现象。查看http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:914029001168