springboot集成dynamic使用@DS实现多数据源问题
首先
在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文件中指定数据库名称和表名,不然会报表不存在

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java客户端通过HTTPS连接到Easysearch实现过程
这篇文章主要为大家介绍了Java客户端通过HTTPS连接到Easysearch实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-11-11
在Android系统中使用WebViewClient处理跳转URL的方法
这篇文章主要介绍了在Android系统中使用WebViewClient处理跳转URL的方法,实现代码为Java语言编写,是需要的朋友可以参考下2015-07-07
springboot时间格式化的五种方法总结(解决后端传给前端的时间显示不一致)
这篇文章主要给大家介绍了关于springboot时间格式化的五种方法,文中介绍的方法解决了后端传给前端的时间显示不一致,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下2024-01-01
Spring data jpa @Query update的坑及解决
这篇文章主要介绍了Spring data jpa @Query update的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-02-02


最新评论