摘要:顾名思义,是用于数据源选择切换的框架,这是一款基于切面指定注解实现的,通过简单的数据源注解配置就可以完成访问时的自动切换,切换过程中是线程安全的。注意事项在使用时需要添加对应数据库的依赖如果使用连接池,不要配置使用的依赖,请使用依赖。
ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接口开发者可以选着性完成开箱即用, 不再为搭建接口框架而犯愁,从而极大的提高开发效率。
ApiBoot DataSource Switch顾名思义,DataSource Switch是用于数据源选择切换的框架,这是一款基于Spring AOP切面指定注解实现的,通过简单的数据源注解配置就可以完成访问时的自动切换,DataSource Switch切换过程中是线程安全的。
添加依赖使用DataSource Switch很简单,在pom.xml配置文件内添加如下依赖:
org.minbox.framework api-boot-starter-datasource-switch
ApiBoot所提供的依赖都不需要添加版本号,具体查看ApiBoot版本依赖
集成数据源实现目前ApiBoot DataSource Switch集成了Druid、HikariCP两种数据源实现依赖,在使用方面也有一定的差异,因为每一个数据源的内置参数不一致。
Druid:参数配置前缀为api.boot.datasource.druid
HikariCP:参数配置前缀为api.boot.datasource.hikari
具体使用请查看下面功能配置介绍。
配置参数参数名 | 参数默认值 | 是否必填 | 参数描述 |
---|---|---|---|
api.boot.datasource.primary | master | 否 | 主数据源名称 |
api.boot.datasource.druid.{poolName}.url | 无 | 是 | 数据库连接字符串 |
api.boot.datasource.druid.{poolName}.username | 无 | 是 | 用户名 |
api.boot.datasource.druid.{poolName}.password | 无 | 是 | 密码 |
api.boot.datasource.druid.{poolName}.driver-class-name | com.mysql.cj.jdbc.Driver | 否 | 驱动类型 |
api.boot.datasource.druid.{poolName}.filters | stat,wall,slf4j | 否 | Druid过滤 |
api.boot.datasource.druid.{poolName}.max-active | 20 | 否 | 最大连接数 |
api.boot.datasource.druid.{poolName}.initial-size | 1 | 否 | 初始化连接数 |
api.boot.datasource.druid.{poolName}.max-wait | 60000 | 否 | 最大等待市场,单位:毫秒 |
api.boot.datasource.druid.{poolName}.validation-query | select 1 from dual | 否 | 检查sql |
api.boot.datasource.druid.{poolName}.test-while-idle | true | 否 | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 |
api.boot.datasource.druid.{poolName}.test-on-borrow | false | 否 | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
api.boot.datasource.druid.{poolName}.test-on-return | false | 否 | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
api.boot.datasource.hikari.{poolName}.url | 无 | 是 | 数据库连接字符串 |
api.boot.datasource.hikari.{poolName}.username | 无 | 是 | 用户名 |
api.boot.datasource.hikari.{poolName}.password | 无 | 是 | 密码 |
api.boot.datasource.hikari.{poolName}.driver-class-name | com.mysql.cj.jdbc.Driver | 否 | 数据库驱动类全限定名 |
api.boot.datasource.hikari.{poolName}.property | 无 | 否 | HikariCP属性配置 |
HikariCP数据源是SpringBoot2.x自带的,配置参数请访问HikariCP。
单主配置ApiBoot DataSource Switch支持单主数据源的配置,application.yml配置文件如下所示:
api: boot: datasource: # 配置使用hikari数据源 hikari: # master datasource config master: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456修改主数据源名称
master为默认的主数据源的poolName,这里可以进行修改为其他值,不过需要对应修改primary参数,如下所示:
api: boot: datasource: # 主数据源,默认值为master primary: main # 配置使用hikari数据源 hikari: # main datasource config main: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456
在上面配置主数据源的poolName修改为main。
主从配置如果你的项目内存在单主单从、一主多从的配置方式,如下所示:
api: boot: datasource: # 配置使用hikari数据源 hikari: # master datasource config master: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # 默认值为【com.mysql.cj.jdbc.Driver】 #driver-class-name: com.mysql.cj.jdbc.Driver # slave 1 datasource config slave_1: url: jdbc:mysql://localhost:3306/oauth2?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # slave 2 datasource config slave_2: url: jdbc:mysql://localhost:3306/resources?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456
在上面是一主多从的配置方式,分别是master、slave_1、slave_2。
多类型数据库配置ApiBoot DataSource Switch提供了一个项目内连接多个不同类型的数据库,如:MySQL、Oracle...等,如下所示:
api: boot: # 主数据源,默认值为master primary: mysql hikari: mysql: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 oracle: url: jdbc:oracle:thin:@172.16.10.25:1521:torcl username: root password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver
在上面配置中,master主数据源使用的MySQL驱动连接MySQL数据库,而slave从数据源则是使用的Oracle驱动连接的Oracle数据库。
动态创建数据源ApiBoot DataSource Switch内部提供了动态创建数据源的方法,可以通过注入ApiBootDataSourceFactoryBean来进行添加,如下所示:
@Autowired private ApiBootDataSourceFactoryBean factoryBean; public void createNewDataSource() throws Exception { // 创建Hikari数据源 // 如果创建Druid数据源,使用DataSourceDruidConfig DataSourceHikariConfig config = new DataSourceHikariConfig(); // 数据库连接:必填 config.setUrl("jdbc:mysql://localhost:3306/resources"); // 用户名:必填 config.setUsername("root"); // 密码:必填 config.setPassword("123456"); // 数据源名称:必填(用于@DataSourceSwitch注解value值使用) config.setPoolName("dynamic"); // 创建数据源 DataSource dataSource = factoryBean.newDataSource(config); Connection connection = dataSource.getConnection(); System.out.println(connection.getCatalog()); connection.close(); }自动切换
ApiBoot DataSource Switch的数据源自动切换主要归功于Spring的AOP,通过切面@DataSourceSwitch注解,获取注解配置的value值进行设置当前线程所用的数据源名称,从而通过AbstractRoutingDataSource进行数据源的路由切换。
我们沿用上面一主多从的配置进行代码演示,配置文件application.yml参考上面配置,代码示例如下:
从数据源示例类@Service @DataSourceSwitch("slave") public class SlaveDataSourceSampleService { /** * DataSource Instance */ @Autowired private DataSource dataSource; /** * 演示输出数据源的catalog * * @throws Exception */ public void print() throws Exception { // 获取链接 Connection connection = dataSource.getConnection(); // 输出catalog System.out.println(this.getClass().getSimpleName() + " ->" + connection.getCatalog()); // 关闭链接 connection.close(); } }主数据源示例类
@Service @DataSourceSwitch("master") public class MasterDataSourceSampleService { /** * DataSource Instance */ @Autowired private DataSource dataSource; /** * Slave Sample Service */ @Autowired private SlaveDataSourceSampleService slaveDataSourceSampleService; /** * 演示输出主数据源catalog * 调用从数据源类演示输出catalog * * @throws Exception */ public void print() throws Exception { Connection connection = dataSource.getConnection(); System.out.println(this.getClass().getSimpleName() + " ->" + connection.getCatalog()); connection.close(); slaveDataSourceSampleService.print(); } }
在主数据源的示例类内,我们通过@DataSourceSwitch("master")注解的value进行定位连接master数据源数据库。
同样在从数据库的示例类内,我们也可以通过@DataSourceSwitch("slave")注解的value进行定位连接slave数据源数据库。
单元测试示例在上面的测试示例中,我们使用交叉的方式进行验证数据源路由是否可以正确的进行切换,可以编写一个单元测试进行验证结果,如下所示:
@Autowired private MasterDataSourceSampleService masterDataSourceSampleService; @Test public void contextLoads() throws Exception { masterDataSourceSampleService.print(); }
运行上面测试方法,结果如下所示:
MasterDataSourceSampleService ->test 2019-04-04 10:20:45.407 INFO 7295 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting... 2019-04-04 10:20:45.411 INFO 7295 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed. SlaveDataSourceSampleService ->oauth2
单次执行数据源切换没有任何的问题,master数据源获取catalog输出后,调用slave示例类进行输出catalog。
ApiBoot DataSource Switch会在项目启动时首先初始化master节点DataSource实例,其他实例会在第一次调用时进行初始化。压力性能测试
单次执行单线程操作没有问题,不代表多线程下不会出现问题,在开头说到过ApiBoot DataSource Switch是线程安全的,所以接下来我们来验证这一点,我们需要添加压力测试的依赖,如下所示:
org.databene contiperf 2.3.4 test
接下来把上面的单元测试代码改造下,如下所示:
// 初始化压力性能测试对象 @Rule public ContiPerfRule i = new ContiPerfRule(); @Autowired private MasterDataSourceSampleService masterDataSourceSampleService; /** * 开启500个线程执行10000次 */ @Test @PerfTest(invocations = 10000, threads = 500) public void contextLoads() throws Exception { masterDataSourceSampleService.print(); }
测试环境:注意事项硬件:i7、16G、256SSD
系统:OS X
整个过程大约是10秒左右,ApiBoot DataSource Switch并没有发生出现切换错乱的情况。
在使用ApiBoot DataSource Switch时需要添加对应数据库的依赖
如果使用Druid连接池,不要配置使用druid-starter的依赖,请使用druid依赖。
配置poolName时不要添加特殊字符、中文、中横线等。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74059.html
摘要:重复任务循环任务,当在不传递重复执行次数时,不进行重复执行,仅仅执行一次,如下所示参数恒宇少年每次循环的间隔时间,单位毫秒循环次数开始时间,秒后执行任务类任务由类进行构建。 ApiBoot Quartz ApiBoot内部集成了Quartz,提供了数据库方式、内存方式的进行任务的存储,其中数据库方式提供了分布式集群任务调度,任务自动平滑切换执行节点。 引用ApiBoot Quartz ...
摘要:相关配置配置参数参数介绍默认值是否启用文档标题快速集成文档文档描述通过自动化配置快速集成文档,仅需一个注解一个依赖即可。注意通过所获取的类型都为。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接口开发者可以选着性完成开箱即用, 不再为搭建接口框架而犯愁,从而极大...
摘要:如下所示不配置默认使用自定义是的概念,用于自定义转换实现,比如自定义格式化日期自动截取小数点等。下面提供一个的简单示例,具体的使用请参考官方文档。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接口开发者可以选着性完成开箱即用, 不再为搭建接口框架而犯愁,从而极大...
摘要:的短信服务模块是由阿里云的国际短信服务提供的,支持国内和国际快速发送验证码短信通知和推广短信。前提需要到阿里云控制台申请开通短信服务。如果在阿里云控制台定义的短信模板存在多个参数,可以通过方法来进行挨个添加,该方法返回值为本对象。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接...
摘要:如果全部使用默认值的情况话不需要做任何配置方式前提项目需要添加数据源依赖。获取通过获取启用在使用格式化时非常简单的,配置如下所示开启转换转换时所需加密,默认为恒宇少年于起宇默认不启用,签名建议进行更换。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接口开发者可以选着性完成开箱即...
阅读 1365·2021-10-11 10:58
阅读 1452·2021-09-04 16:41
阅读 650·2019-08-30 15:55
阅读 778·2019-08-29 18:46
阅读 3114·2019-08-29 14:05
阅读 3502·2019-08-26 14:00
阅读 2429·2019-08-26 13:53
阅读 3104·2019-08-26 13:29