SpringBoot+MybatisPlus整合多数据源(踩坑指南)

更新时间:2023-05-16 04:27:24 阅读: 评论:0

SpringBoot+MybatisPlus整合多数据源(踩坑指南)
⼀、配置perproties/yml⽂件
(1)不同数据库的配置信息
spring.datasource.sql.jdbc.Driver
#at= com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/paidan_data_upload?characterEncoding=utf8&uSSL=fal&rverTimezone=UTC&rewriteBatchedStatement spring.datasource.urname=root
spring.datasource.password=123456
pe=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.tion-timeout=300000
#spring.datasource.slave.poolName=slave
spring.datasource.slave.sql.jdbc.Driver
spring.datasource.slave.url=jdbc:mysql://localhost:3306/paidan_data_upload2?characterEncoding=utf8&uSSL=fal&rverTimezone=UTC&rewriteBatchedSta spring.datasource.slave.urname=root
spring.datasource.slave.password=123456
spring.datasource.slave.hikari.minimum-idle=5
spring.datasource.slave.hikari.maximum-pool-size=15
spring.datasource.slave.hikari.auto-commit=true
spring.datasource.slave.hikari.idle-timeout=300000
spring.datasource.slave.hikari.pool-name=DatebookHikariCP
梦见树上开花
spring.datasource.slave.hikari.max-lifetime=1800000
spring.datasource.tion-timeout=300000
mybatis-plus.mapper-locations=classpath:/mapper/*l
#实体扫描,多个package⽤逗号或者分号分隔
mybatis-plus.global-config.id-type=3
mybatis-plus.global-config.field-strategy=2
mybatis-plus.global-config.db-column-underline=true
mybatis-plus.global-config.capital-mode=true
没奶水怎么办
⼆、⼀些配置⽂件
(1)DatabaType(不同数据库的名字标志(可以任意填写))
public enum DatabaType {
dataBa1,
dataBa2
}
(2)DynamicDataSource(动态数据源(需要继承AbstractRoutingDataSource))
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
//使⽤DatabaContextHolder获取当前线程的DatabaType
DatabaType();
}
}
(3)DatabaContextHolder(保存⼀个线程安全的DatabaType容器)public class DatabaContextHolder {
private static final ThreadLocal<DatabaType> contextHolder = new ThreadLocal<>();
public static void tDatabaType(DatabaType type) {
contextHolder.t(type);
}
public static DatabaType getDatabaType() {
();
}
}
(4)Mybatisplus配置
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
//设置⽅⾔
page.tDialectType("mysql");
return page;
}
/**
* sql性能分析插件
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor().tFormat(fal);
}
/**
* 执⾏分析插件
*/
@Bean
平均数public SqlExplainInterceptor sqlExplainInterceptor() {
SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
sqlExplainInterceptor.tStopProceed(fal);
return sqlExplainInterceptor;
}
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource")我是一只鸟
public DataSource masterDataSource() {
ate().build();
}
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
ate().build();
}
/**
* Primary 该注解表⽰在同⼀个接⼝有多个实现类可以注⼊的时候,默认选择哪⼀个,⽽不是让@autowire注解报错
* Qualifier 根据名称进⾏注⼊,通常是在具有相同的多个类型的实例的⼀个注⼊(例如有多个DataSource类型的实例)    */
@Bean
@Primary
public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {重师官网
Map<Object, Object> targetDataSources = new HashMap<>();
射雕英雄传歌曲
targetDataSources.put(DatabaType.dataBa1, masterDataSource);
targetDataSources.put(DatabaType.dataBa2, slaveDataSource);
DynamicDataSource dataSource = new DynamicDataSource();
// 该⽅法是AbstractRoutingDataSource的⽅法
dataSource.tTargetDataSources(targetDataSources);
// 默认的datasource设置为myTestDbDataSource
dataSource.tDefaultTargetDataSource(masterDataSource);
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) throws Exception {
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean =new MybatisSqlSessionFactoryBean();
中国朝代顺序完整表mybatisSqlSessionFactoryBean.tDataSource(this.dataSource(masterDataSource, slaveDataSource));
Object();
}
/**
* 配置事务管理器
*/
@Bean
public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) throw
s Exception {        return new DataSourceTransactionManager(dataSource);
}
}
(5)使⽤
@GetMapping(value = "/test")
public void saveTestServerUrl() {
List<ServerUrl> rverUrlRestult = rverUrlDao.lectList(new EntityWrapper<>());
System.out.println(rverUrlRestult);
DatabaContextHolder.tDatabaType(DatabaType.dataBa2);
List<ServerUrl> rverUrlRestult1 = rverUrlDao.lectList(new EntityWrapper<>());
System.out.println(rverUrlRestult1);
}
三、注意(踩坑)麻醉英文
(1)之前按照整合mybatis多数据源的⽅式去整合mybatisplus,项⽬正常启动,但是当请求db的时候,出现
org.apache.ibatis.binding.BindingException: Invalid bound statement not found 错误。当时想的是mybatisplus和mybatis是向下兼容的,配置的⽅式应该是⼀样的。然后事实并⾮如此,出现这个问题之后,就猜想是不是缺少哪些配置,导致mybatisplus扫描不到⾃⼰封装的xml⽂件(调⽤的是plus⾃带的⽅法,没有⾃定义xml⽂件)。之后尝试过各种mapperscan,⽆济于事。。。。
先说明,原理还没搞懂。⼤概原因是,MybatisPlus需要⽤⾃⼰的 MybatisSqlSessionFactoryBean,⽤SqlSessionFactory 可能有问题。
(2)解决⽅案:
将mybatisplus配置sqlSessionFactory改成MybatisSqlSessionFactoryBean。问题解决
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean =new MybatisSqlSessionFactoryBean();
mybatisSqlSessionFactoryBean.tDataSource(this.dataSource(masterDataSource, slaveDataSource));

本文发布于:2023-05-16 04:27:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/902200.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:配置   数据源   类型   线程   问题   时候
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图