关于druid 数据源配置热更新

1aaf6o9v  于 4个月前  发布在  Druid
关注(0)|答案(1)|浏览(60)

druid version 1.2.6
看代码com.alibaba.druid.pool.DruidDataSource 中的restart方法,只会关闭druid,并不是重启,如下:

public void restart() throws SQLException {
        lock.lock();
        try {
            if (activeCount > 0) {
                throw new SQLException("can not restart, activeCount not zero. " + activeCount);
            }
            if (LOG.isInfoEnabled()) {
                LOG.info("{dataSource-" + this.getID() + "} restart");
            }

            this.close();
            this.resetStat();
            this.inited = false;
            this.enable = true;
            this.closed = false;
        } finally {
            lock.unlock();
        }
    }

而且 com.alibaba.druid.pool.DruidAbstractDataSource 中数据源的配置属性,都会判断inited,如果为true,不允许修改,例如setUsername会抛出UnsupportedOperationException,如下:

public void setUsername(String username) {
        if (StringUtils.equals(this.username, username)) {
            return;
        }

        if (inited) {
            throw new UnsupportedOperationException();
        }

        this.username = username;
    }

druid init的时候设置为true(即初始化后便不允许变更),即使执行close方法也无法修改配置属性(close方法并不会设置inited = false),只有执行restart才能修改配置。但是restart 会执行close方法不会执行init方法。所以现在如果想热加载druid的配置需要先执行restart(restart 会将inited 设置为false),然后修改配置后再执行init方法,如下:

//获取spring管理的DataSource
  DruidDataSource dataSource = (DruidDataSource) SpringContextHolder.getBean(DruidDataSource.class);
  dataSource.restart();
  //动态刷新配置
  setDruidConfig(dataSource);
  dataSource.init();

感觉这样做不是很合理,不知道是不是我理解的有问题,烦请解惑!

xienkqul

xienkqul1#

我理解在getconnection的时候会调用init方法, 不知道理解是否正确

public DruidPooledConnection getConnection() throws SQLException {
        return getConnection(maxWait);
    }

    public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
        init();

        if (filters.size() > 0) {
            FilterChainImpl filterChain = new FilterChainImpl(this);
            return filterChain.dataSource_connect(this, maxWaitMillis);
        } else {
            return getConnectionDirect(maxWaitMillis);
        }
    }```

相关问题