Springboot实现多数据源整合的两种⽅式,java堆与栈的区别⾯试
如果⽂章对你有帮助,可以帮忙⼀键三连和专栏订阅哦! 技术圈⼦经过这段时间的筹划,已经初步成型!有兴趣、志同道合的⼩伙伴可以查看左边导航栏的技术圈⼦介绍,期待你们的加⼊!
本篇⽂章重点介绍SpringBoot集合MyBatis和MyBatis-Plus整合多数据源⽅⾯的知识!
⼆、专栏推荐
=========
良⼼推荐: 下⾯的相关技术专栏还在免费分享哦,⼤家可以帮忙点点订阅哦!
三、整合多数据源需要了解的知识
==================
1、何时会使⽤到多数据源
⼀个技术的出现、应⽤必然是为了解决存在的某些问题,多数据源出现常见的场景如下:
(1)、与第三⽅对接时,有些合作⽅并不会为了你的某些需求⽽给你开发⼀个功能,他们可以提供给你⼀个可以访问数据源的只读账号,你需要获取什么数据由你⾃⼰进⾏逻辑处理,这时候就避免不了需要进⾏多数据源整合了。
(2)、业务数据达到了⼀个量级,使⽤单⼀数据库存储达到了⼀个瓶颈,需要进⾏分库分表等操作进⾏数据管理,在操作数据时,不可避免的涉及到多数据源问题。
2、多数据源整合有哪些⽅式
参考了⽹上的许多材料,发现整合⽅式⽆外乎以下⼏种:
(1)、使⽤分包⽅式,不同的数据源配置不同的MapperScan和mapper⽂件
(2)、使⽤APO切⽚⽅式,实现动态数据源切换(如果对Aop不是很熟悉,欢迎查看我之前的⼀篇⽂章,这知识保熟哦!【】)
(3)、使⽤数据库代理中间件,如Mycat等
3、不同⽅式之间的区别
(1)、分包⽅式可以集合JTA(JAVA Transactional API)实现分布式事务,但是整个流程的实现相对来说⽐较复杂。
(2)、AOP动态配置数据源⽅式缺点在于⽆法实现全局分布式事务,所以如果只是对接第三⽅数据源,不涉及到需要保证分布式事务的话,是可以作为⼀种选择。
(3)、使⽤数据库代理中间件⽅式是现在⽐较流⾏的⼀种⽅式,很多⼤⼚也是使⽤这种⽅式,开发者不需要关注太多与业务⽆关的问题,把它们都交给数据库代理中间件去处理,⼤量的通⽤的数据聚合,事务,数据源切换都由中间件来处理,中间件的性能与处理能⼒将直接决定应⽤的读写性能,⽐较常见的有Mycat、TDDL等。现在阿⾥出了100%⾃研的分布式数据库OceanBase,从最底层⽀持分布式,性能也⾮常强⼤,⼤家感兴趣的可以去了解下!
4、本⽂实战选择的⽅式
鉴于本次遇到需求的整合多数据源的场景是需要 对接第三⽅的数据,暂不涉及到分布式事务问题 ,所以本⽂实战整合多数据源使⽤的⽅式是【分包⽅式】实现简单的多数据源整合,⾄于其他⽅式和分布式事务的坑,后⾯再慢慢填吧(o(╥﹏╥)o)!
四、SpringBoot+MyBatis整合多数据源
=============================
4.1 说明
本次案例涉及到的代码⽐较多,因此⽂章只贴出部分,全部案例代码已经上传到Gitee,需要者可直接访问:【】,项⽬结构如下:
4.2 涉及依赖包
spring-boot-starter-web – web相关⽀持
mybatis-spring-boot-starter – springboot整合mybatis依赖
mysql-connector-java – mysql数据驱动
lombok – ⾃动⽣成实体类常⽤⽅法依赖包
hutool-all – 常⽤⽅法封装依赖包
org.springframework.boot
spring-boot-starter-web
mybatis-spring-boot-starter
2.2.0
mysql
mysql-connector-java
8.0.13
org.projectlombok
lombok
true
cn.hutool
hutool-all
5.4.5
4.3 项⽬配置
项⽬启动端⼝
server:
port: 9090
项⽬名称
spring:
application:
name: multi-datasource-instance
datasource:
主数据库
master:
注意,整合多数据源时如果使⽤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: sql.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: sql.cj.jdbc.Driver
4.4 编写主副数据库数据源配置
1、主数据源相关配置:主要是指定主数据源、扫描的mapper地址、事务管理器等信息。
@Configuration
// 指定主数据库扫描对应的Mapper⽂件,⽣成代理对象
@MapperScan(basePackages =“com.diary.it.multi.datasource.mapper” ,sqlSessionFactoryRef =“masterSqlSessionFactory”)
public class MasterDataSourceConfig {
// l所在地址
private static final String MAPPER_LOCATION = “classpath*:mapper/*.xml”;springboot aop
/**
主数据源,Primary注解必须增加,它表⽰该数据源为默认数据源
项⽬中还可能存在其他的数据源,如获取时不指定名称,则默认获取这个数据源,如果不添加,则启动时候回报错
*/
@Primary
@Bean(name = “masterDataSource”)
// 读取spring.datasource.master前缀的配置⽂件映射成对应的配置对象
@ConfigurationProperties(prefix = “spring.datasource.master”)
public DataSource dataSource() {
DataSource build = ate().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));
Object();
}
}
2、副数据源相关配置:主要是指定数据源、扫描的mapper地址、事务管理器等信息。
@Configuration
// 指定从数据库扫描对应的Mapper⽂件,⽣成代理对象
@MapperScan(basePackages = “com.diary.it.multi.datasource.mapper2”, sqlSessionFactoryRef =“slaveSqlSessionFactory”)
public class SlaveDataSourceConfig {
// l所在地址
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 = ate().build();
return build;
}
/**
事务管理器
*/
@Bean(name = “slaveTransactionManager”)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论