SpringBoot动态切换数据库
我也写了几篇关于springboot多数据源的问题,多数据源并不是动态数据源,多数据源其实也就是静态的数据源,主要还是不同的方法调用不同的DAO层,但是今天我要做到的就是根据前端发送的参数不同,实现请求不同数据库中内容,并返回,也就是动态的切换数据源的问题。
还有一点要实现的就是,不能通过配置文件的方式进行数据源的添加和删除,而要通过数据库的方式进行数据源的添加和删除。根据参考文章Springboot 从数据库读取数据库配置信息,动态切换多数据源 最详细实战教程 (这篇文章的需求跟我的很像,也是从数据库获取数据库信息,然后进行动态切换,我根据这篇文章,差不多可以成功了。),基本上实现了数据源的动态切换,我这里只是摘录相关的关键点,即我在操作时遇到的一些问题。
1.搞定SpringBoot多数据源(2):动态数据源
1.创建数据库
主要包括DataSource数据,以及其他数据库
2.添加依赖
1 | <!-- Druid --> |
3.配置主数据源
4.创建DataSource类
这个类的作用就是创建数据库连接信息
5.创建DruidDBConfig.java
配置默认的数据源,配置Druid数据库连接池,配置sql工厂加载mybatis的文件,扫描实体类等
6.手动切换数据源的 DBContextHolder.java
7.DynamicDataSource.java
手动加载默认数据源、创建数据源连接、检查数据源连接、删除数据源连接等
8.DataSourceMapper.java、DBChangeService.java以及DBChangeServiceImpl.java类
9.改造DruidDBConfig
以为我用的是mybatis plus,所以在返回SqlSessionFactory时,不能返回默认的SqlSessionFactory,需要返回MyBatisSqlSessionFactory,所以需要改造如下内容。
1 |
|
1.SpringBoot + Mybatis配合AOP和注解实现动态数据源切换配置 (这篇文章中使用了AOP进行了动态数据源的切换,不需要结合注解进行)
2.SpringBoot 自定义+动态切换数据源 (这篇文章还讲了如何通过AOP+注解的方式进行动态数据源的切换)
3.Springboot 从数据库读取数据库配置信息,动态切换多数据源 最详细实战教程 (这篇文章的需求跟我的很像,也是从数据库获取数据库信息,然后进行动态切换,我根据这篇文章,差不多可以成功了。)
4.Spring Boot 动态数据源(多数据源自动切换) (这篇也是使用注解的方式进行动态数据源的切换)
5.springboot实现动态数据库切换 (这个主要讲了如何编写注解,以及使用AOP)
1.select 1 from dual
验证数据库的有效性,常用的语句如下:
- hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
- Oracle - select 1 from dual
- DB2 - select 1 from sysibm.sysdummy1
- mysql - select 1
- microsoft SQL Server - select 1 (tested on SQL-Server 9.0, 10.5 [2008])
- postgresql - select 1
- ingres - select 1
- derby - values 1
- H2 - select 1
- Firebird - select 1 from rdb$database
问题
1.Cannot resolve symbol ‘RelaxedDataBinder’
在使用Druid配置多数据源的时候,报这个错误。因为我的spring-boot-starter-parent版本是2.3.2.RELEASE,所以我尝试了将druid依赖,换成了druid-spring-boot-starter依赖,但是还是不行
1 | <!-- <dependency> |
我还尝试添加了druid-spring-boot2-starter,还是不起作用。
1 | <dependency> |
1.Spring boot 2.0 配置报错java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyRes (这个方法不起作用)
2.spring boot 2.x版本:java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedDataBinder (这里也是两种方法,一种就是使用jdbc,一种是使用SpringBoot 1.5x)
3.SpringBoot 2.1.x 启动报错:java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedDataBin (这里讲了三个方法,其实都没有用,我不能降低SpringBoot版本,提高了Druid版本,没有用,然后就是使用jdbc连接,也没有用)
4.spring boot2 druid java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedDataBinder
5.drtrang/druid-spring-boot (druid-spring-boot2)
2.The connection string contains a badly formed name or value
3.dataSource already closed
这个是我在调用 contextHolder.remove(); 切换回主数据源的时候,出现的问题,