动态修改JDBC数据源配置

因项目需要能动态修改数据源的配置,及修改后不用重启整个应用。使用的数据源是apache的BasicDataSource,网上千篇一律的是如下实现:

BasicDataSource bds=getDataSource();
  try{
   bds.close();
   
  }
  catch(Exception e){
   e.printStackTrace();
  }
  bds.setUsername("sa");
  bds.setPassword("admin");

 

还说要先关闭,再修改配置才能生效。

 

这样的代码根本就实现不了所说的功能,直接运行出错。连接池关闭后,就无法使用了。本身也没有open,reopen之类的方法。

也有说C3P0支持热修改,但本身好像有bug,容易出错死锁错误。也就没有去研究到底支持不。

BasicDataSource 的close方法其实只设置了一个标识变量:closed,标记为关闭就取不到连接,要是能修改该标识为非关闭,就可以继续使用了。

所以实现的思路是:先关闭,再修改配置,再打开标识。问题是BasicDataSource并没有这样的接口提供出来,幸运的是,BasicDataSource中的

closed属性是protected,也就是我们可以在子类中访问到这个属性,也就可以进行修改了。

所以只要自定义一个类继承于BasicDataSource,提供如下方法即可:

public void open(){
  this.closed=false;
 }

 

当然配置文件中使用的数据源的类名就需要改为这个自定义类了。

说明:文章为作者从CSDN迁移过来

原文地址:https://www.cnblogs.com/hbwblog/p/7254095.html