在应用中需要修改数据源配置信息的场景可能比较少,但是如果有需要按照以下步骤进行操作:
1.项目中druidDataSource已经初始化完成;
2.直接对该数据源进行配置填充时会报错,具体原因为:
com.alibaba.druid.pool.DruidAbstractDataSource 中数据源的配置属性,都会判断inited,如果为true,不允许修改
// 不管是dataSource.setUrl还是setUserName等方法
// 在其内部都有对是否初始化状态进行判断,如下:
public void setUsername(String username) {
if (StringUtils.equals(this.username, username)) {
return;
}
if (inited) {
throw new UnsupportedOperationException();
}
this.username = username;
}
若数据源在之前已经进行过初始化了,那么就会报错;解决办法就是将初始化状态设置为false,官方提供的方法是 restart();
3.在配置填充之前调用 restart() 方法;
druid init的时候设置为true(即初始化后便不允许变更),即使执行close方法也无法修改配置属性(close方法并不会设置inited = false),只有执行restart才能修改配置。但是restart 会执行close方法不会执行init方法。所以现在如果想热加载druid的配置需要先执行restart(restart 会将inited 设置为false),然后修改配置后再执行init方法,如下:
dataSource.restart();
其源码为:
public void restart(Properties properties) 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;
if (properties != null) {
configFromProperties(properties);
}
} finally {
lock.unlock();
}
}
4.在填充完配置之后,再调用init() 方法即可;
dataSource.init();