【问题标题】:Connection pooling showing INACTIVE connections in database连接池显示数据库中的 INACTIVE 连接
【发布时间】: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


    【解决方案1】:

    不用担心,会话处于 INACTIVE 状态并不是异常情况。检查http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:914029001168

    【讨论】:

    • 感谢您的快速回复,我应该如何知道我通过 java 保持的连接?
    • 这取决于您的连接池配置、应用程序对连接的使用情况以及会话参数(例如会话的最大非活动时间)。
    • 我在 getConnection() 方法中从哈希表中获取数据源时发现了一个问题。它应该是 dbUtil.DSht.containsKey(compcode) 而不是 dbUtil.DSht.contains(compcode)。
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 2015-06-27
    • 2015-08-09
    • 1970-01-01
    • 2011-05-28
    • 2021-09-21
    • 2014-10-19
    • 2010-10-23
    相关资源
    最近更新 更多