【实战干货】SpringBoot整合多数据源(1)

注意,整合多数据源时如果使用springboot默认的数据库连接池Hikari,指定连接数据使用的是jdbc-url而不是url属性

jdbc-url: jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

username: root

password: 123456

driver-class-name: com.mysql.cj.jdbc.Driver

副数据库

slave:

注意,整合多数据源时如果使用springboot默认的数据库连接池Hikari,指定连接数据使用的是jdbc-url而不是url属性

jdbc-url: jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

username: root

password: 123456

driver-class-name: com.mysql.cj.jdbc.Driver

🟢 4.4 编写主副数据库数据源配置


1、主数据源相关配置:主要是指定主数据源、扫描的mapper地址、事务管理器等信息。

@Configuration

// 指定主数据库扫描对应的Mapper文件,生成代理对象

@MapperScan(basePackages =“com.diary.it.multi.datasource.mapper” ,sqlSessionFactoryRef = “masterSqlSessionFactory”)

public class MasterDataSourceConfig {

// mapper.xml所在地址

private static final String MAPPER_LOCATION = “classpath*:mapper/*.xml”;

/**

  • 主数据源,Primary注解必须增加,它表示该数据源为默认数据源

  • 项目中还可能存在其他的数据源,如获取时不指定名称,则默认获取这个数据源,如果不添加,则启动时候回报错

*/

@Primary

@Bean(name = “masterDataSource”)

// 读取spring.datasource.master前缀的配置文件映射成对应的配置对象

@ConfigurationProperties(prefix = “spring.datasource.master”)

public DataSource dataSource() {

DataSource build = DataSourceBuilder.create().build();

return build;

}

/**

  • 事务管理器,Primary注解作用同上

*/

@Bean(name = “masterTransactionManager”)

@Primary

public PlatformTransactionManager dataSourceTransactionManager(@Qualifier(“masterDataSource”) DataSource dataSource) {

return new DataSourceTransactionManager(dataSource);

}

/**

  • session工厂,Primary注解作用同上

*/

@Bean(name = “masterSqlSessionFactory”)

@Primary

public SqlSessionFactory sqlSessionFactory(@Qualifier(“masterDataSource”) DataSource dataSource) throws Exception {

final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();

sessionFactoryBean.setDataSource(dataSource);

sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MasterDataSourceConfig.MAPPER_LOCATION));

return sessionFactoryBean.getObject();

}

}

2、副数据源相关配置:主要是指定数据源、扫描的mapper地址、事务管理器等信息。

@Configuration

// 指定从数据库扫描对应的Mapper文件,生成代理对象

@MapperScan(basePackages = “com.diary.it.multi.datasource.mapper2”, sqlSessionFactoryRef = “slaveSqlSessionFactory”)

public class SlaveDataSourceConfig {

// mapper.xml所在地址

private static final String MAPPER_LOCATION = “classpath*:mapper2/*.xml”;

/**

  • 数据源

*/

@Bean(name = “slaveDataSource”)

// 读取spring.datasource.slave前缀的配置文件映射成对应的配置对象

@ConfigurationProperties(prefix = “spring.datasource.slave”)

public DataSource dataSource() {

DataSource build = DataSourceBuilder.create().build();

return build;

}

/**

  • 事务管理器

*/

@Bean(name = “slaveTransactionManager”)

public PlatformTransactionManager dataSourceTransactionManager(@Qualifier(“slaveDataSource”) DataSource dataSource) {

return new DataSourceTransactionManager(dataSource);

}

/**

  • session工厂

*/

@Bean(name = “slaveSqlSessionFactory”)

public SqlSessionFactory sqlSessionFactory(@Qualifier(“slaveDataSource”) DataSource dataSource) throws Exception {

final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();

sessionFactoryBean.setDataSource(dataSource);

sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(SlaveDataSourceConfig.MAPPER_LOCATION));

return sessionFactoryBean.getObject();

}

}

🔵 4.5 执行结果


完成上面的步骤后,就跟我们平常写业务逻辑的方式一样,在service中写业务逻辑,在mapper中写sql语句等,下面看看执行结果!

在这里插入图片描述

🟣 4.6 整合中遇到的问题


看完上面的教程,是不是发现其实整合多数据源其实也挺简单的!但是,完全按照教学流程整合还是遇到各种问题的现象真的太常见了,下面博主就总结下整合中遇到的各种问题,如果你在整合过程中也遇到了,可以直接按照博主的解决方案来哦(贴心吧!)。

问题1、出现 jdbcUrl is required with driverClassName异常

原因: SpringBoot2.x后默认的数据库连接池就是HikariCP(号称史上最快,性能最高),HikariCP连接池中命名规则和其他的连接池不太一样,指定连接数据库的地址时,它使用的是jdbc-url而不是url,所以如果我们不指定数据库连接池如druid而使用springboot默认的连接池的话,需要将配置中连接数据库的url改成jdbc-url属性。

问题2、 出现 Invalid bound statement (not found)异常

原因:

(1)、在定义数据源配置信息时没有指定SqlSessionFactoryBean扫描的mapper.xml文件的位置即 sessionFactoryBean.setMapperLocations(xxx)。

(2)、mapper.xml文件中namespace属性对应的路径不准确或者对应方法的id名称、parameterType属性不对

(3)、xxxMapper.java的方法返回值是List,而select元素没有正确配置ResultMap,或者只配置ResultType

问题3、 出现 required a single bean, but 2 were found异常

原因: 因为我们在指定主副数据源配置时已经使用MapperScan注解进行扫描对应的mapper.java,此时被扫描到的mapper.java已经生成代理类到Spring容器,如果此时在启动类中再使用MapperScan扫描则会成出现上面的问题(奇怪的是:这个问题我换一台电脑就不报错了,所以出现这个问题先按照这个方案解决吧)

问题4、 主数据源配置类中为什么添加Primary注解

原因: 因为整合了多数据源,所以DataSource、PlatformTransactionManager等实例都会注入多个到Spring容器中,Primary注解的作用就是:当我们使用自动配置的方式如Autowired注入Bean时,如果这个Bean有多个候选者,如果其中一个候选者具有@Primary注解修饰,该候选者会被选中,作为自动配置的值。

问题5、 com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别

原因: 细心的小伙伴会发现,在数据库配置中driver-class-name属性的值为com.mysql.cj.jdbc.Driver,其实com.mysql.jdbc.Driver 是 对应mysql-connector-java 5驱动的,com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6及之后的数据库驱动的,如果使用了6.x后的mysql数据库驱动还继续使用com.mysql.jdbc.Driver 则启动时会报deprecated(过时的),同时使用mysql6.x后的驱动需要指定时区serverTimezone:

五、SpringBoot+Mybatis-Plus整合多数据源

🚲 五、SpringBoot+Mybatis-Plus整合多数据源

=======================================================================================================

上面Mybatis使用分包的方式整合多数据源多少还是有些麻烦的,但是使用MyBatis-Plus就比较简单了,MyBatis-Plus官方就支持了多数据源,使用的时候只需要一个注解就可以实现,整合多数据源的时候推荐使用该种方式。

🟥 5.1 说明


本次案例涉及到的代码比较多,因此文章只贴出部分,全部案例代码已经上传到Gitee,需要者可直接访问:【实战-SpringBoot结合MyBatis-Plus整合多数据源】,mybatis-plus多数据源支持

在这里插入图片描述

项目结构如下:

在这里插入图片描述

🟧 5.2 涉及的依赖包


  • spring-boot-starter-web – web相关支持
  • mybatis-plus-boot-starter-- springboot整合mybatis-plus依赖
  • dynamic-datasource-spring-boot-starter – mybatis-plus管理数据源依赖
  • mysql-connector-java – mysql数据驱动
  • lombok – 自动生成实体类常用方法依赖包
  • hutool-all – 常用方法封装依赖包

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

runtime

com.baomidou

dynamic-datasource-spring-boot-starter

3.4.1

com.baomidou

mybatis-plus-boot-starter

3.4.3

org.projectlombok

lombok

true

cn.hutool

hutool-all

5.4.5

🟨 5.3 相关配置


启动端口

server:

port: 9091

项目名称

spring:

application:

name: multi-datasource-instance2

datasource:

采用动态选取

dynamic:

primary: master #设置默认的数据源或者数据源组,默认值即为master

strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源

datasource:

主数据库

master:

url: jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

username: root

password: 123456

driver-class-name: com.mysql.cj.jdbc.Driver

副数据库

slave:

url: jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

username: root

password: 123456

driver-class-name: com.mysql.cj.jdbc.Driver

🟩 5.4 使用方式


在这里插入图片描述

🟦 5.5 执行结果


在这里插入图片描述

六、写在最后

最后

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值