iteye_17284 2012-08-30 09:19
浏览 574
已采纳

有关proxool,max-active-time这个参数的疑问

max-active-time,这个东西 解释 是 active超过这个限制的 线程会被kill掉,

1.

这时候 这个被kill的线程的连接 是被close归还给数据库

还是说 只是被release 到连接池,而连接池 继续保持这个连接

按照监控连接池的页面 表面上观测到的是

active 线程被杀掉后,总共active+avaliable 的总数是没有变的

2.

上面问题的延伸,如果max-active-time 是直接close 回归到数据库,那么

如果业务频繁,先杀掉一批连接 然后 又立马创建一批连接,这样数据库是不是 撑不住

PS:以上所说max-active-time 杀掉的线程 都是 没有正常释放连接的,
正常的业务都是短连接,能够正常的释放

  • 写回答

3条回答 默认 最新

  • jinnianshilongnian 2012-08-30 13:26
    关注

    maximum-active-time:表示连接的最大活动时间,即这个连接在指定的时间内没有完成任务(如查询),将

    org.logicalcobwebs.proxool.HouseKeeper 是一个后台线程 用于监控线程池的:
    [code="java"] if (activeTime > definition.getMaximumActiveTime()) {

                       // This connection has been active for way too long. We're
                       // going to kill it :)
                       connectionPool.removeProxyConnection(proxyConnection, ConnectionListenerIF.MAXIMUM_ACTIVE_TIME_EXPIRED, 
                               "it has been active for too long", ConnectionPool.FORCE_EXPIRY, true);[/code]
    

    1、这段代码用于检查线程池中的每个连接是否超过了最大获得时间
    2、如果超过了,会调用connectionPool.removeProxyConnection回收连接

    [code="java"]protected void removeProxyConnection(ProxyConnectionIF proxyConnection, int reasonCode, String reason, boolean forceExpiry, boolean triggerSweep) {
    // Just check that it is null
    if (forceExpiry || proxyConnection.isNull()) {

            proxyConnection.setStatus(ProxyConnectionIF.STATUS_NULL);
    
            /* Run some code everytime we destroy a connection */
    
            try {
                onDeath(proxyConnection.getConnection(), reasonCode);
            } catch (SQLException e) {
                log.error("Problem during onDeath (ignored)", e);
            }
    
            // The reallyClose() method also decrements the connectionCount.
            try {
                proxyConnection.reallyClose();
            } catch (SQLException e) {
                log.error(e);
            }
    
            try {
                // If we're shutting down then getting a write lock will cause a deadlock
                if (isConnectionPoolUp()) {
                    acquireConnectionStatusWriteLock();
                }
                proxyConnections.remove(proxyConnection);
            } finally {
                if (isConnectionPoolUp()) {
                    releaseConnectionStatusWriteLock();
                }
            }
    
            if (log.isDebugEnabled()) {
                log.debug(displayStatistics() + " - #" + FormatHelper.formatMediumNumber(proxyConnection.getId())
                        + " removed because " + reason + ".");
            }
    
            if (triggerSweep) {
                PrototyperController.triggerSweep(getDefinition().getAlias());
            }
    
        } else {
            log.error(displayStatistics() + " - #" + FormatHelper.formatMediumNumber(proxyConnection.getId())
                    + " was not removed because isNull() was false.");
        }
    }[/code]                     
    

    proxyConnection.reallyClose();这句话会关闭真实的connection 并放回到连接池。

    一定要注意:我们用了proxool后 返回给我们的connection是一个代理的连接,代理连接执行时再委托给真实的JDBC连接。

    HouseKeeper 就是一个后台线程 定期检查连接的健康状况。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?