动态修改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迁移过来

时间: 2024-10-17 04:27:51

动态修改JDBC数据源配置的相关文章

Spring BeanPostProcessor与动态加载数据源配置

前言: 本文旨在介绍Spring动态配置数据源的方式,即对一个DataSource的配置诸如jdbcUrl,user,password,driverClass都通过运行时指定,而非由xml静态配置. Spring构造Context的参数一般只包含配置文件路径和类加载器,如果需要达到动态传入配置参数的目的,需要Spring在初始化数据源相关bean的时候能够对原有配置执行修改或替换,为方便处理,本文将定义一个名为DynamicDataSourceConfigHolder的公共类提供配置数据存储.

集算报表用Java动态修改报表数据源

实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景.常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改数据源来满足实际需要. 下面通过一个使用JAVA程序修改集算报表数据源SQL的例子说明使用过程. 编辑报表模板: 由于不同数据源的字段不同,因此这里使用动态表达式ds1.fname()获取字段名,ds1.field()获取字段值.此外,第一行和第一列为辅助行列,设置其隐藏. 编写代码: 1.读入报表

weblogic配置jdbc数据源

weblogic配置jdbc数据源的过程 方法/步骤 启动weblogic 管理服务器,使用管理用户登录weblogic管理控制台   打开管理控制台后,在左侧的树形域结构中,选择服务->数据源. 在右侧的窗口中,选择 新建->一般数据源   填写数据源名称,JNDI名,选择数据库类型(本文以Oracle数据库为例) 点击下一步按钮   选择数据库驱动程序,点击下一步按钮   事务处理选项画面,点击 下一步 按钮   新建JDBC数据源画面 数据库名称 主机名 端口号 数据库用户名 密码 用于

Elasticsearch 动态修改replica配置、增删replica

1. 获取当前所有index配置 curl -XGET http://localhost:9200/_settings 2. 获取某些index的配置 curl -XGET http://localhost:9200/test-*/_settings 3. 动态修改某些index配置,增加replica curl -XPUT http://localhost:9200/test-*/_settings -d '{"replicas":1}' 4. 动态修改某些index配置,删除rep

MyBatis动态数据源配置

1.通过spirngboot构建项目主要依赖 mybatis+mysql+aspect <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><dependency>&l

使用Apollo动态修改线上数据源

前言 最近需要实现一个功能,动态刷新线上数据源环境,下面来使用Apollo配置中心和Spring提供的AbstractRoutingDataSource来实现. 具体实现 Apollo是携程开源的统一配置中心,和springboot无缝衔接并且不需要安装其他软件就可以直接使用,可以实时推送最新的配置文件.Spring提供的AbstractRoutingDataSource用于动态管理数据源,可以动态更新数据源,一般数据库的读写分离也是用这个抽象类实现的. 对Apollo不熟悉的可以先了解一下,G

eclipse下jdbc数据源与连接池的配置及功能简介

今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急剧下降,那么怎么解决这个问题呢? 我所学到的方法就是通过JDBC数据源和连接池的方式来解决这个问题.利用DataSource来建立数据库的连接不需要加载JDBC驱动,也不需要DriverManager类,通过向一个JNDI服务器查询来得到DataSource对象,然后调用DataSource对象的g

spring中配置jdbc数据源

1.加入jdbc驱动器包,mysql-connector-java.jar 2.加入commons-dbcp.jar配置数据源 3.在classpath下新建文件jdbc.properties,配置jdbc数据源参数 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc\:mysql\://localhost\:3306/baiyin jdbc.username=root jdbc.password=123456 4.在xml中导入数据

皕杰报表:连接数据库失败,请检查数据源配置(oracle.jdbc.driver.OracleDriver)

皕杰报表:连接数据库失败,请检查数据源配置(oracle.jdbc.driver.OracleDriver)问题解决: 缺少了classes12.jar 在窗口--首选项--报表运行时配置--添加--确认 原文地址:https://www.cnblogs.com/uranusyo/p/11349366.html