druiddatasource多数据源(多数据源invalid bound statement)

druiddatasource多数据源(多数据源invalid bound statement)分包方式可以集合 JTA JAVA Transactiona API 实现分布式事务 但是整个流程的实现相对来说比较复杂 AOP 动态配置数据源方式缺点在于无法实现全局分布式事务 所以如果只是对接第三方数据源 不涉及到需要保证分布式事务的话 是可以作为一种选择 使用数据库代理中间件方式是现在比较流行的一种方式 很多大厂也是使用这种方式 开发者不需要关注太多与业务无关的问题



 
 
 
 

  1. 分包方式可以集合JTA(JAVA Transactional API)实现分布式事务,但是整个流程的实现相对来说比较复杂。
  2. AOP动态配置数据源方式缺点在于无法实现全局分布式事务,所以如果只是对接第三方数据源,不涉及到需要保证分布式事务的话,是可以作为一种选择。
  3. 使用数据库代理中间件方式是现在比较流行的一种方式,很多大厂也是使用这种方式,开发者不需要关注太多与业务无关的问题,把它们都交给数据库代理中间件去处理,大量的通用的数据聚合,事务,数据源切换都由中间件来处理,中间件的性能与处理能力将直接决定应用的读写性能,比较常见的有Mycat、TDDL等。现在阿里出了100%自研的分布式数据库OceanBase,从最底层支持分布式,性能也非常强大,大家感兴趣的可以去了解下!

一个spring和Mybatis的框架的项目中,我们在spring配置中往往是配置一个dataSource来连接数据库,然后绑定给sessionFactory,在dao层代码中再指定sessionFactory来进行数据库操作。

 正如上图所示,每一块都是指定绑死的,如果是多个数据源,也只能是下图中那种方式。

可看出在Dao层代码中写死了两个SessionFactory,这样日后如果再多一个数据源,还要改代码添加一个SessionFactory,显然这并不符合开闭原则。

主要是MyBatis框架分包方式实现

2.1.1 配置两个数据源配置

 

2.1.2 编写主副数据库数据源配置

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

 

 2.1.3 副数据源相关配置

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

 

2.1.4  UserController层

 

2.1.5 Service层

照常注入主从两个Dao层

 
 

AbstrictRoutingDataSource的本质就是利用一个Map将数据源存储起来,然后通过Key来得到Value来修改数据源。 

2.2.1 主要步骤

在 SpringBoot 项目中实现读写分离通常需要以下几步:

  1. 配置数据源:你需要为读操作和写操作分别配置一个数据源。
  2. 创建数据源路由逻辑:这通常通过扩展 Spring 的 AbstractRoutingDataSource 来实现。它允许你根据一定的逻辑来决定使用哪个数据源(读或写)。
  3. 配置事务管理器:这使得你能够在使用不同数据源时保持事务的一致性。
  4. 服务层或DAO层设计:确保在执行读操作时使用读数据源,在执行写操作时使用写数据源。
  5. 自定义切面,在切面中解析 @DataSource 注解。当一个方法或者类上面,有 @DataSource 注解的时候,将 @DataSource 注解所标记的数据源列出来存入到 ThreadLocal 中。

注意:这里使用ThreadLocal的原因是为了保证我们的线程安全。

2.2.2 配置文件类

 

2.2.3 创建数据源枚举类

 

2.2.4 数据源切换处理

 
 

2.2.5 注入数据源

 

2.2.6 自定义多数据源切换注解

 

 2.2.7 AOP拦截类的实现

 

2.2.8 使用切换数据源注解

 
 

MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

使用MP提供的Dynamic-datasource多数据源框架,实现在不同数据源间切换,通过`@DS`注解实现对master和slave数据库的选择,展示了从配置、持久层到控制层的完整代码示例。

dynamic-datasource特性

  • 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
  • 支持数据库敏感配置信息 加密 ENC()。
  • 支持每个数据库独立初始化表结构schema和数据库database。
  • 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。
  • 支持 自定义注解 ,需继承DS(3.2.0+)。
  • 提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。
  • 提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。
  • 提供 自定义数据源来源 方案(如全从数据库加载)。
  • 提供项目启动后 动态增加移除数据源 方案。
  • 提供Mybatis环境下的 纯读写分离 方案。
  • 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
  • 支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
  • 提供 基于seata的分布式事务方案。
  • 提供 本地多数据源事务方案。 附:不能和原生spring事务混用

2.3.1 引入依赖

 

2.3.2 配置文件

 

 注意:

这里数据源的名字可以自定义,什么master、slave都可以随意命名。
这里可以根据格式自行添加数据源的个数,并且支持多种数据库,如oracle、达梦等。此处为了演示方便,都使用了mysql数据库。

2.3.3 dao层

 

注意:

  1. 注解不止可以用在持久层,可以用在任意的类和方法上。
  2. 注解作用在方法上的优先级 > 类。

也就是说可以在类上加一个注解默认一个该类的数据源,如,
再在具体的方法上加一个注解做个性化指定,如,效果等同:

 

2.3.4 创建service

 

创建service实现类,并调用持久层接口,根据传入的参数切换不同的方法:

 

2.3.5 .编写控制层代码

 
 

jdbcTemplate连接数据库就是用jdbcTemplate对象去调用它的query、udate、insert等方法操作数据库。
jdbcTemplate必须有dao层实现类,因为jdbcTemplate是在dao层用jdbcTemplate对应的方法操作sql语句的

2.4.1 配置文件

在或中配置两个数据源的基本属性:

 

创建配置类来定义两个数据源的Bean和对应的:

 

 2.4.2 定义数据库表对应的实体类

 

2.4.3 dao层

 
 

 2.4.4 service层

 
 

2.4.5 控制曾代码

 

编程小号
上一篇 2025-07-05 21:21
下一篇 2025-04-12 15:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/57684.html