springboot之多数据源配置

这篇具有很好参考价值的文章主要介绍了springboot之多数据源配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、多数据源的典型使用场景

实际开发中,进场可能遇到在一个引用中可能需要访问多个数据库的情况,以下是两种典型场景:

1 业务复杂(数据量大)

数据分布在不同的数据库汇总,数据库拆了,应用没拆。一个公司多个子项目,各用各的数据库,涉及数据共享。。。。
springboot多数据源配置,spring boot,后端,java

2 读写分离

为了解决数据库的读性能瓶颈(读比写性能更高,写锁会影响读阻塞,从而影响读的性能)。
很多数据拥主从架构。也就是,一台主数据库服务器,对外提供增删改查的生产服务器;另一台从数据库服务器,主要进行读的操作。

可以通过中间件(ShardingSphere、mycat、mysql-proxy 、TDDL 。。。。) 但是有一些规模较小的公司,没有专门的中间件团队搭建读写分离基础设施,因此需要业务开发人员自行实现读写分离。

springboot多数据源配置,spring boot,后端,java

这里的框架与上图类似。 不同的是,在读写分离中,主库和从库的数据库是一致的(不考虑主从延迟)。数据更新操作(insert 、update、delete)都是在主库上进行的,主库将数据更新信息同步给
从库。在查询时,可以在从库上进行。从而分担主库的压力。

二、如何实现多数据源

对于大多数的java应用,都是用了spring框架,spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource, 然后在 运行时来动态的访问哪个数据库。这种方式访问数据的框架图如下所示:
springboot多数据源配置,spring boot,后端,java

应用直接操作的 AbstractRoutingDataSource的实现类,告诉AbstractRoutingDataSource访问哪个数据库,然后由AbstractRoutingDataSource从事先配置好的数据源(db1,db2) 选择一个,来访问对应的数据库。

通过AbstractRoutingDataSource动态指定数据源

多数据源切换方式

springboot多数据源配置,spring boot,后端,java
应用直接操作的是abstractRoutingDataSource的实现类,告诉AbstractRoutingDataSource访问哪个数据库,然后由AbstractRoutingDataSource从事先配置好的数据源 (ds1,ds2)选择哪一个 ,来访问对应的数据库。
springboot多数据源配置,spring boot,后端,java

AOP

@Component
@Aspect
public class DynamicDataSourceAspect {

    //前置
    @Before(value ="within(com.example.dynamic.datasource.service.impl.*) && @annotation(wr)")
    public  void before( WR wr){
        String value = wr.value();
        RoutingDataSourceContext order = new RoutingDataSourceContext(value);
        System.out.println("数据源===="+value);
    }
}

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface WR {
    String value() default "query";
}
@RestController
@RequestMapping("frend")
@Slf4j

public class FrendController {
    @WR
    @GetMapping("query")
    public List<menu> query(){
        List<menu> list = menuService.list();
        return list;
    }
    }

MyBatis插件

  • 读写分离的数据源:如果是Mybaits 可以结合插件实现读写分离动态切换数据源
package com.example.dynamic.datasource.plugin;

import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.example.dynamic.datasource.config.DynamicDataSource;
import com.example.dynamic.datasource.config.RoutingDataSourceContext;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.util.Properties;

/**
 * @ClassName:DynamicDataSourcePlugin
 * @Description:
 * @Author:
 * @Date:8/20/23 10:21 下午
 * @Versiion:1.0
 */
//1.如下配置
//2. 将文件加入到mybatis中去
//Intercepts 声明mybatis 固定的写法
//Signature 代表为mybatis 底层的哪个对象,去进行插件代理
@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class,Object.class}),
@Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class,
        ResultHandler.class})})
public class DynamicDataSourcePlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //拿到当前方法【update、query】的所有参数
        Object[] objects =invocation.getArgs();
        //MappedStatement 封装sql
        MappedStatement ms = (MappedStatement) objects[0];
        //
        if(ms.getSqlCommandType().equals(SqlCommandType.SELECT)){
            //读方法
            RoutingDataSourceContext order = new RoutingDataSourceContext("query");
        }else{
            //写方法
            RoutingDataSourceContext order = new RoutingDataSourceContext("update");
        }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target){
        if(target instanceof Executor){
            return Plugin.wrap(target,this);
        }else{
            return target;
        }
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

三、spring集成多个Mybatis框架 实现多数据源控制

springboot多数据源配置,spring boot,后端,java

四、多数据源事务控制

在多数据源下,由于涉及到数据库的多个读写。一旦发生异常就可能会导致数据不一致的情况,在一种情况希望使用事务进行回退。但是spring的声明式食物再一次请求线程中只能使用一个数据源进行控制

但是对于多源数据库:
1.单一事务管理器(TransactionManager)无法切换数据源,需要配置多个TransactionManager。
2.@Transactionnal 是无法管理多个数据源的。如果像真正实现多源数据库事务控制,肯定是需要分布式事务。这里讲解多数据源事务控制 是一种变通的方式。文章来源地址https://www.toymoban.com/news/detail-723743.html

@Bean 
pbulic DataSourceTransactionManager transactionManager1(DynamicDataSource dataSource){
	DataSourceTransactionManager dataSourceTransactionManager =new DataSourceTransactionManager();
	dataSourceTransactionManager.setDataSource(dataSource);
	return dataSourceTransactionManager;
}

@Bean
public DataSourceTransactionManager transactionManager2(DynamiceDataSource dataSource){
		DataSourceTransactionManager dataSourceTransactionManager =new DataSourceTransactionManager();
	dataSourceTransactionManager.setDataSource(dataSource);
	return dataSourceTransactionManager;
}

1.只使用主库TransactionManager

四、dynamic-datasource 多数据源组件

到了这里,关于springboot之多数据源配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在Spring Boot中配置双数据源?

    在许多应用程序中, 可能会遇到需要连接多个数据库的情况 。这些数据库可以是不同的类型,例如关系型数据库和NoSQL数据库,或者它们可以是相同类型但包含不同的数据。为了处理这种情况,我们可以使用双数据源来管理多个数据库连接。 双数据源是指在一个应用程序中

    2024年02月11日
    浏览(40)
  • Spring Boot MyBatis Plus 配置数据源详解

    🎉欢迎来到架构设计专栏~Spring Boot MyBatis Plus 配置数据源详解 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,如果文

    2024年01月21日
    浏览(47)
  • Spring Boot多数据源配置详解及报错问题解决

    Spring Boot多数据源配置详解 前几天,公司提了个需求,对一个项目进行二次开发,在开发过程中,需要配置多数据源来进行数据库的操作。下面我将主键探索总结的配置流程和遇到的各种坑做以总结,希望能够帮到遇到同样问题的友友。有错的地方,请各位大佬留言指出。

    2024年02月16日
    浏览(42)
  • spring boot下基于spring data jpa配置mysql+达梦多数据源(以不同包路径方式,mysql为主数据源)

    :mysql 达梦/dameng jpa 多数据源 spring boot:2.1.17.RELEASE mysql驱动:8.0.21(跟随boot版本) 达梦驱动:8.1.2.192 lombok:1.18.12(跟随boot版本) 以mysql为主数据源,达梦为第二数据源方式配置 适用于旧项目二次开发接入达梦数据库或基于通用二方/三方包做业务扩展等场景 将以不

    2024年02月05日
    浏览(50)
  • Spring Boot 2.7.5 HikariCP 连接池多数据源配置

    当前项目遇到需要连接多个数据库的场景,此时需要引入多数据源了. 还有一些诸如以下的场景: 与第三方对接时,有些合作方并不会为了你的某些需求而给你开发一个功能,他们可以提供给你一个可以访问数据源的只读账号,你需要获取什么数据由你自己进行逻辑处理,这时

    2024年02月05日
    浏览(39)
  • 【Spring Boot 3】【数据源】自定义多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年02月01日
    浏览(55)
  • 【Spring Boot 3】【数据源】自定义JPA数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月21日
    浏览(59)
  • 【Spring Boot】Spring Boot整合多数据源

    在实际的开发工作中,我们经常会遇到需要整合多个数据源的情况,比如同时连接多个数据库、读写分离、跨数据库查询等。本文将介绍如何使用Spring Boot来实现多数据源的整合,对于刚刚接触开发的小伙伴可能有一些帮助。 在一个应用程序中使用多个数据源意味着我们需要

    2024年02月10日
    浏览(33)
  • 【Spring Boot 3】【数据源】自定义JDBC多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月23日
    浏览(41)
  • 【Spring Boot 3】【数据源】自定义JPA多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月22日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包