springboot集成dynamic使用@DS实现多数据源问题
作者:疯狂小野码
这段文章主要介绍了Spring Boot多数据源配置及使用Seata进行分布式事务管理的方法,并强调了配置细节的重要性,包括排除特定自动配置、正确配置数据源、处理事务管理及排除相关jar包版本问题等
首先
在pom文件导入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.4</version>
</dependency>修改配置文件

配置文件信息
如下
server:
port: 8087
# 设置tomcat的post请求大小为无限制
tomcat:
max-http-form-post-size: -1
spring:
# 设置日期格式
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
# 设置请求大小为无限制
servlet:
multipart:
max-file-size: -1
max-request-size: -1
datasource:
dynamic:
primary: model
datasource:
model:
url: jdbc:kingbase8:
driver-class-name: com.kingbase8.Driver
username:
password:
plan:
url: jdbc:kingbase8:
driver-class-name: com.kingbase8.Driver
username:
password:
project:
url: jdbc:kingbase8:
driver-class-name: com.kingbase8.Driver
username:
password:
jpa:
open-in-view: false
# 是否在控制台展示sql
show-sql: true
# 如果实体类中添加新字段,或者没有表 创建新的表
hibernate:
ddl-auto: none
properties:
# hibernate方言:就是对应数据库,在根据对应的数据库进行自动实现sql
hibernate.dialect: org.hibernate.dialect.Kingbase8Dialect
mybatis:
mapper-locations: classpath*:mybatis/*Mapper.xml
##配置分页插件pagehelper
pagehelper:
#heleperDialect表示配置PageHelper的方言,一般取值为mysql、oracle
helperDialect: mysql
#reasonable表示分页合理化参数,其取值默认为false,会直接根据分页参数(PageNum、PageSize)进行查询。当该参数设置为true时,pageNum小于等于0时会查询第一页,pageNum>pages(超过总数时),会查询最后一页
reasonable: true
#supportMethodsArguments表示PageHelper是否支持根据mapper方法的入参对象(queryModel)的pageNum、pageSize 来分析是否进行自动分页,默认为false(推荐配置),为true的情况下一不留神会给自己带来坑,除非我们的入参对象(queryModel)中不含这两个字段
supportMethodsArguments: false
#为了支持PageHelper的startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
params: count=countSql
#swagger配置
springfox:
documentation:
swagger:
use-model-v3: false其中配置了三个数据源,其中选择model作为默认数据源(对应primary配置);
启动类如下
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@MapperScan(basePackages = "com.cnooc.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}要在@SpringBootApplication注解中把DataSourceAutoConfiguration.class排除
最后使用@DS
使用@DS在service的实现类上、方法上
使用@DS在mapper的类上、方法上进行使用
其中在类上使用代表,整个实现类的数据源指向某一个,在方法上使用时,代表这个方法的数据源指向某一个
示例:

遇到问题
配置好之后,进行项目启动时,报了如下错误

这是因为在pom文件中没有把jdbc或者mybatis的jar包注掉,注掉即可。
补充:
事务管理:
在多数据源场景下,事务管理需要特别注意。默认情况下,Spring 的事务管理器只能管理一个数据源。如果需要跨数据源事务,可以使用分布式事务解决方案(如 Seata)。需要在项目中引入 seata-spring-boot-starter 依赖。并在配置文件中进行相关配置。在方法上添加 @GlobalTransactional 注解来开启全局事务。
- 单数据源,使用@Transactional
- 多数据源,可以使用@DSTransactional注解(从版本3.3.0之后才可以使用这个注解)
再次补充:
因为引入的jar报是2.5.4,配置多数据源时,一定要加driver-class-name,不然启动会报错
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
另外还可以换成springboot3的jar包
<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot3-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>4.1.3</version>
</dependency>再再次补充:
想在两个不同数据源的service方法中调用互相调用,则需要在对应数据源的xml文件中指定数据库名称和表名,不然会报表不存在

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
