当前位置:网站首页 > 数据科学与大数据 > 正文

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



 
  
 
  

  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 配置文件

 
  

 注意:

2.3.3 dao层

 
  

注意:

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

2.3.4 创建service

 
  

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

 
  

2.3.5 .编写控制层代码

 
  

2.4.1 配置文件

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

 
  

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

 
  

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

 
  

2.4.3 dao层

 
  
 
  

 2.4.4 service层

 
  
 
  

2.4.5 控制曾代码

 
  

到此这篇druiddatasource多数据源(多数据源invalid bound statement)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 学术数据库官网下载(学术数据库官网下载)2026-02-07 07:00:08
  • 数据库课程设计案例(数据库课程设计文档)2026-02-07 07:00:08
  • matlab如何输出多种结果(matlab输出一组数据)2026-02-07 07:00:08
  • db数据库文件怎么打开(用dbc怎样打开数据库)2026-02-07 07:00:08
  • bytebuf 读取所有数据(读取byte数组)2026-02-07 07:00:08
  • orecal数据库区分大小写吗(数据库如何区分大小写)2026-02-07 07:00:08
  • 数据库课程号怎么表示(查询数据库课程的课程号和学分)2026-02-07 07:00:08
  • 大数据技术是学什么的就业方向女生(大数据专业学什么适合女生学吗)2026-02-07 07:00:08
  • score电竞(score电竞数据)2026-02-07 07:00:08
  • 数据中台建设方案(数据中台建设方案39P)2026-02-07 07:00:08
  • 全屏图片