zoukankan      html  css  js  c++  java
  • 数据库连接池druid断开重连

    使用数据库连接池druid,需要在与数据库断开时重新连接,可对com.alibaba.druid.pool.DruidDataSource的属性进行设置。
    有如下两种设置方式:
    1、每次检查数据库连接: testOnBorrow设置为true(注意大并发可能会有性能问题)。
    2、闲时检查数据库连接:testOnBorrow设置为false,testWhileIdle设置为true,闲置时间大于timeBetweenEvictionRunsMillis即可重连。

    相关源码(DruidDataSource.java)如下:
    public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throws SQLException {
        int notFullTimeoutRetryCnt = 0;
        for (;;) {
            // handle notFullTimeoutRetry
            DruidPooledConnection poolableConnection;
            try {
                poolableConnection = getConnectionInternal(maxWaitMillis);
            } catch (GetConnectionTimeoutException ex) {
                if (notFullTimeoutRetryCnt <= this.notFullTimeoutRetryCount && !isFull()) {
                    notFullTimeoutRetryCnt++;
                    if (LOG.isWarnEnabled()) {
                        LOG.warn("get connection timeout retry : " + notFullTimeoutRetryCnt);
                    }
                    continue;
                }
                throw ex;
            }
    
            if (testOnBorrow) {
                boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
                if (!validate) {
                    if (LOG.isDebugEnabled()) {
                        LOG.debug("skip not validate connection.");
                    }
    
                    Connection realConnection = poolableConnection.conn;
                    discardConnection(realConnection);
                    continue;
                }
            } else {
                Connection realConnection = poolableConnection.conn;
                if (poolableConnection.conn.isClosed()) {
                    discardConnection(null); // 传入null,避免重复关闭
                    continue;
                }
    
                if (testWhileIdle) {
                    long currentTimeMillis             = System.currentTimeMillis();
                    long lastActiveTimeMillis          = poolableConnection.holder.lastActiveTimeMillis;
                    long idleMillis                    = currentTimeMillis - lastActiveTimeMillis;
    
                    long timeBetweenEvictionRunsMillis = this.timeBetweenEvictionRunsMillis;
    
                    if (timeBetweenEvictionRunsMillis <= 0) {
                        timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
                    }
    
                    if (idleMillis >= timeBetweenEvictionRunsMillis
                            || idleMillis < 0 // unexcepted branch
                            ) {
                        boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
                        if (!validate) {
                            if (LOG.isDebugEnabled()) {
                                LOG.debug("skip not validate connection.");
                            }
    
                            discardConnection(realConnection);
                             continue;
                        }
                    }
                }
            }
    
            if (removeAbandoned) {
                StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
                poolableConnection.connectStackTrace = stackTrace;
                poolableConnection.setConnectedTimeNano();
                poolableConnection.traceEnable = true;
    
                activeConnectionLock.lock();
                try {
                    activeConnections.put(poolableConnection, PRESENT);
                } finally {
                    activeConnectionLock.unlock();
                }
            }
    
            if (!this.defaultAutoCommit) {
                poolableConnection.setAutoCommit(false);
            }
    
            return poolableConnection;
        }
    }
  • 相关阅读:
    使用rem来开发你的移动端网站
    在网页布局中合理使用inline formating context(IFC)
    构建OLAP CDP平台 Maven父子项目
    2014世界杯决赛观后感
    2013岁末总结
    11月11日上班杂谈
    这一年
    湖南联通发福利了C#为你月赚150M流量回家过年不再愁
    C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)
    C# 实现对接电信交费易自动缴费
  • 原文地址:https://www.cnblogs.com/MrHacker/p/14121660.html
Copyright © 2011-2022 走看看