1.将 db.properties 存放在classpath路径;

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ceshi?useUnicode=true&characterEncoding=utf8
username=root
password=root

2.使用Bean的方式配置 dataSource

package com.shulipeng.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.shulipeng.AutocodeApplication;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import javax.sql.DataSource;
import java.sql.SQLException; /**
* @author shulipeng
* @Description:
* @date 2018/4/2
*/
@Configuration
public class DataSourceConfig { private static Logger logger = LoggerFactory.getLogger(DataSourceConfig.class); //数据库类型
private String dbType; @Bean(name = "dataSource")
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
try {
PropertiesConfiguration properties = new PropertiesConfiguration("db.properties");
String driverClassName = properties.getString("driverClassName");
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(properties.getString("url"));
dataSource.setUsername(properties.getString("username"));
dataSource.setPassword(properties.getString("password")); //判断数据库类型
if(driverClassName.contains(Constant.DB_TYPE_MYSQL)){
this.setDbType(Constant.DB_TYPE_MYSQL);
}else if(driverClassName.contains(Constant.DB_TYPE_ORACLE)){
this.setDbType(Constant.DB_TYPE_ORACLE);
} } catch (ConfigurationException e) {
logger.error("获取数据库配置文件失败" + e);
} return dataSource;
} /**
* 动态修改数据库链接
*/
public void changeDataSource () {
Thread restartThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
AutocodeApplication.restart();
} catch (InterruptedException ignored) {
}
}
});
restartThread.setDaemon(false);
restartThread.start();
} public String getDbType() {
return dbType;
} public void setDbType(String dbType){
this.dbType = dbType;
}
}

3.定义一个前台改变数据库配置文件并且重启的方法

  /**
* 动态修改数据库地址,并且重新启动应用
* @param dbMap
* @return
*/
@PostMapping("/db/update")
@ResponseBody
R changeDB(@RequestParam Map<String,Object> dbMap){
try {
PropertiesConfiguration conf = new PropertiesConfiguration("db.properties");
conf.setProperty("driverClassName",dbMap.get("driverClassName"));
conf.setProperty("url",dbMap.get("url"));
conf.setProperty("username",dbMap.get("username"));
conf.setProperty("password",dbMap.get("password"));
conf.save();
dataSourceConfig.changeDataSource();
} catch (ConfigurationException e) {
logger.error("获取数据库配置文件失败:" + e);
return R.error("保存配置文件时出错" + e);
}
return R.ok();
}

4.修改Application.java

package com.shulipeng;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext; @ServletComponentScan
@MapperScan("com.shulipeng.dao")
@SpringBootApplication
public class AutocodeApplication { private static String[] args;
private static ConfigurableApplicationContext context; public static void main(String[] args) {
AutocodeApplication.args = args;
AutocodeApplication.context = SpringApplication.run(AutocodeApplication.class, args);
} public static void restart() {
context.close();
AutocodeApplication.context = SpringApplication.run(AutocodeApplication.class, args); }
}

5.就这样就可以了,只是每次修改数据源就会重启服务。Spring cloud 有一个注解 RefreshScope 好像可以实现不用重启项目就可以动态修改数据源的方式,但是没有接触过,目前这种正好就是我需要的,所以就记录下来了  

  

  

  

Springboot 实现前台动态配置数据源 (修改数据源之后自动重启)的更多相关文章

  1. Springboot定时任务实现动态配置Cron参数(从外部数据库获取)

    https://blog.csdn.net/qq_35992900/article/details/80429245 我们主要讲解它的动态配置使用方法. 在刚开始使用的时候,我们更改一个任务的执行时间 ...

  2. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

  3. 【Eclipse】Eclipse中tomcat的Server配置(解决修改代码不断的重启服务器)以及设置tomcat文件发布位置与JSP编译位置查看

     Eclipse有时候修改一点JS或者JSP都会自动重启,有时候修改完JS或者JSP之后必须重启服务器才生效,下面研究了server的一些选项之后彻底解决了这些问题,下面做记录: 我的 Eclipse ...

  4. Node.js热部署代码,实现修改代码后自动重启服务方便实时调试

    写PHP等脚本语言的时候,已经习惯了修改完代码直接打开浏览器去查看最新的效果.而Node.js 只有在第一次引用时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,这种设计虽然有利于提高性能,却 ...

  5. springboot基于注解动态配置多数据源以及多数据源的事务统一

    参考文档:https://www.cnblogs.com/zhangboyu/p/7622412.html https://blog.csdn.net/qq_34322777/article/deta ...

  6. Eclipse+Tomcat实现热部署/热加载配置,修改java代码无需重启tomcat

    一.Tomcat热加载配置 Eclipse Package Explorer中找到Servers,点击你所需要运行的tomcat的config配置文件,例如 demo-config,双击该文件夹下的s ...

  7. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

  8. Kafka动态配置实现原理解析

    问题导读 Apache Kafka在全球各个领域各大公司获得广泛使用,得益于它强大的功能和不断完善的生态.其中Kafka动态配置是一个比较高频好用的功能,下面我们就来一探究竟. 动态配置是如何设计的? ...

  9. Springboot+Mybatis+Pagehelper+Aop动态配置Oracle、Mysql数据源

      本文链接:https://blog.csdn.net/wjy511295494/article/details/78825890 Springboot+Mybatis+Pagehelper+Aop ...

随机推荐

  1. spring学习十二 application/x-www-form-urlencoded还是application/json

    application/x-www-form-urlencoded还是application/json get. POST 用哪种格式? 后台如何得到这些值? 如何用ajax  或者是 postman ...

  2. SEO中常用HTML代码大全,及权重排序

    做SEO必须要懂HTML,说的是一点都没错,不过其实是不需要全部都懂,最重点的你懂了会用,基本上都是事半功倍了.可以这么说一个不懂代码的优化人员不算是一个合格的好优化.下面就总结一下做优化,必须要懂得 ...

  3. log4j配置文件加载方式

    使用背景: apache的log4j是一个功能强大的日志文件,当我们使用eclipse等IDE在项目中配置log4j的时候,需要知道我们的配置文件的加载方式以及如何被加载的. 加载方式: (1).自动 ...

  4. oracle——基础知识(二)未完

    1.select 查询 单独的一条 select 语句 可以一次查询多条记录:但是在 pl/sql 块中,select语句只能 使用INTO子句:必须并且只能返回一行 2.EXECUTE IMMEDI ...

  5. 类型:Oracle;问题:oracle 时间加减;结果:ORACLE 日期加减操作

    ORACLE 日期加减操作 无论是DATE还是timestamp都可以进行加减操作. 可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinter ...

  6. Delphi Cookie

    Cookie IdHTTP1.CookieManager.AddCookies(); IdHTTP1.Post(); IdHTTP1.Get('http://1.1.1.1:9000/'); for ...

  7. oracle数据库部分技巧

    由于笔者在操作数据库时,遇到几个以前不太常见的操作,感觉有必要记录一下,如下: 1.查被锁表  SELECT object_name, machine, s.sid, s.serial#  FROM ...

  8. MVC5网站部署到IIS7

    server 2008R2+IIS7.5下配置不会出现什么问题,这里记录下在server2008+IIS7下的配置 参考了一下:http://www.cnblogs.com/fcu3dx/p/3773 ...

  9. java之类和对象

    类的成员: 成员变量和成员函数. 成员函数:构造函数和普通函数. 构造函数: 作用:自动对对象进行初始化 特点:1.方法名和类名一致 2.没有返回值 问: 1.我们能够定义几次构造函数? 我们可以定义 ...

  10. [Python Study Notes]水平柱状图绘制

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...