# DynamicDataSource **Repository Path**: ydjjava/DynamicDataSource ## Basic Information - **Project Name**: DynamicDataSource - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-04 - **Last Updated**: 2021-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
DynamicDataSource
# [DynamicDataSource](https://github.com/yeecode/DynamicDataSource) ![language](https://img.shields.io/badge/language-java-green.svg) ![version](https://img.shields.io/badge/mvn-1.3.2-blue.svg?style=flat) ![license](https://img.shields.io/badge/license-Apache-brightgreen.svg) DynamicDataSource是一个让你在程序运行过程中动态增删和切换数据源的工具。 --- [English Introduction](./README.md) --- 在程序运行过程中进行数据源的切换、增删是一种很常见的需求。它广泛应用在分库应用、读写分离应用、多租户应用等众多应用中。DynamicDataSource使得我们可以便捷地完成这一过程。 # 1 特点 DynamicDataSource具有以下特点: - 小巧:只实现最基本的数据源增删、切换功能,不涉及相关业务。 - 易用:只需要简单的配置和几个方法的调用便可以完成所有功能。 - 兼容:增加数据源时,数据源信息可以来自配置文件、前端界面输入、数据库查询等各种方式。 - 无侵入:切换数据源操作可以由切面触发、逻辑触发、注解触发等,均可以供开发者自由实现。 DynamicDataSource中常用的方法有: - `boolean addDataSource(DataSourceInfo dataSourceInfo, Boolean overwrite)`:增加一个数据源,overwrite用来决定如果已经存在同名数据源时是否要覆盖 - `boolean addAndSwitchDataSource(DataSourceInfo dataSourceInfo, Boolean overwrite)`:增加一个数据源并切换到该数据源,overwrite用来决定如果已经存在同名数据源时是否要覆盖 - `boolean switchDataSource(String dataSourceName)`:切换到指定名称的数据源 - `boolean delDataSource(String dataSourceName)`:删除一个数据源 - `void switchDefaultDataSource()`:切换到默认的数据源 - `DataSource getDefaultDataSource()`:获取默认数据源 以上方法都是多线程安全的。你可以在切面、操作逻辑、注解中调用以上方法,完成数据源的动态增删与切换。 # 2 快速上手 在`\demo`文件夹下提供一个示例项目,供大家快速上手。以该demo项目为例,我们介绍DynamicDataSource的使用。 ## 2.1 引入依赖包 在POM文件中引入DynamicDataSource的jar包。 ``` com.github.yeecode.dynamicdatasource DynamicDataSource {最新版本} ``` ## 2.2 基本配置 在application.properties文件中写入默认的数据源信息,下面为示例。可按照自己的数据源进行修改。 ``` dynamicDataSource.default.url=jdbc:{db}://{pi}:{port}/{database_name} dynamicDataSource.default.username={username} dynamicDataSource.default.password={password} dynamicDataSource.default.driverClassName={dirver} ``` 禁止Spring对DataSourceAutoConfiguration类的加载,否则该类会去加载固定的数据源。 ``` @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ``` 增加对DynamicDataSource所在包的Bean的扫描。 ``` @ComponentScan(basePackages = {"com.github.yeecode.dynamicdatasource","{other_package_root}"}) ``` ## 2.3 开始使用 至此,使用DynamicDataSource所需的全部配置就完成了。使用下面方式注入DynamicDataSource后便可以调用其中的数据源操作方法。 ``` @Autowired private DynamicDataSource dynamicDataSource; ``` 我们可以按照`\demo\sql\DDL.md`文件所述建立两个数据源,然后测试DynamicDataSource的工作情况。 启动DynamicDataSourceDemo项目得到如下界面。 ![运行界面](./pic/demo.png) 例如我们可以在一个接口内实现数据源的切换,从而在请求到达`/`接口时,先后查询了两个数据源中的数据,如代码所示。 ``` @RequestMapping(value = "/") public String queryFromDS() { DataSourceInfo dataSourceInfo = new DataSourceInfo("ds01", "com.mysql.cj.jdbc.Driver", "jdbc:mysql://localhost:3306/datasource01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8", "root", "yeecode"); dynamicDataSource.addAndSwitchDataSource(dataSourceInfo,true); String out = userService.select(); dataSourceInfo = new DataSourceInfo("ds02", "com.mysql.cj.jdbc.Driver", "jdbc:mysql://localhost:3306/datasource02?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8", "root", "yeecode"); dynamicDataSource.addAndSwitchDataSource(dataSourceInfo,true); out += "
"; out += userService.select(); return out; } ``` 可以得到下图所示的结果。下图打印的两行语句分别来自两个数据源。 ![查询结果](./pic/web.png) 数据源新增、删除、切换操作可以在切面中、业务逻辑中、注解中等各处进行触发。DynamicDataSource不做任何限制,交由开发人员按照实际需要实现。 ## 2.4 注意事项 - 因为动态加载数据源要基于反射展开,而编译器无法发现反射中缺乏的类。当运行时发现某些类(多是数据库驱动类)无法被找到时,请确认自己在POM中已经引入了对应的驱动jar包。 - 因为反射的缘故,第一次运行请先打包一次后再运行。否则报因为url配置缺失导致数据源无法找到的问题。