场景
我们springboot项目,通常会有多个数据库,例如mysql,vertica,postgresql等等数据库,通常我们需要动态切换使用我们想要的数据库,这时候就需要配置多数据源了
多数据源特性
支持多数据库类型:例如,同时连接 MySQL、PostgreSQL 和 Vertica 等不同数据库,在应用中能够根据不同的业务需求切换到对应的数据库。
动态数据源切换:根据请求、业务逻辑或用户上下文,动态切换数据源(例如,按用户请求切换到不同的数据库),而不需要重启应用。
数据库隔离:不同业务模块使用不同的数据源,确保它们的数据完全隔离。例如,一个模块使用 MySQL,另一个模块使用 Vertica。
高可用和容错:通过配置多个数据源,可以在主数据库发生故障时自动切换到备用数据库,提升系统的高可用性。
实现
基于springboot3.4配置
引入依赖的方式
添加依赖
<!--动态数据源-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
配置YML文件
spring:
datasource:
dynamic:
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
username: root
password: 123456
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/eshopping?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
username: root
password: 123456
调用数据库
直接再类上加上@DS(“master”)注解即是连接的master数据库
@Service
@DS("master")
public class LoginServiceImpl implements LoginService{
问题
博主这里遇见了问题,因为我配置了JWT+SpringSecurity,这里报错了,信息如下,找不到数据源,猜想应该是和JwtAuthenticationFilter和数据源的加载顺序有关
2025-01-21 21:43:37.097 ERROR --- [ main] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'jwtAuthenticationFilter': Unsatisfied dependency expressed through field 'userDetailsService': Error creating bean with name 'customUserDetailsService': Unsatisfied dependency expressed through field 'loginMapper': Error creating bean with name 'loginMapper' defined in file [E:\IDE\demoNew\target\classes\com\example\demonew\mapper\loginMapper\LoginMapper.class