SpringBoot+Mybatis-Plus实现动态数据源切换
发布时间:2025-05-23 21:33:15 发布人:远客网络
一、SpringBoot+Mybatis-Plus实现动态数据源切换
1、在开发过程中,我们面临了一个需求:数据同步时需同步至多个数据库。浏览资料后发现,大多数教程侧重于使用AOP、DS注解,数据源信息配置在配置文件中。然而,这些方法不符合我们的业务场景。因此,我借鉴了一些教程,设计了一个简易的动态数据源切换方案。接下来,我将分享这个实现过程。
2、首先,我们准备了三个数据库:test1作为主数据库,用于存储数据源信息(datasource表);test2和test3是需要切换的其他数据库;两张用户表结构保持一致。
3、依赖方面,仅需引入Spring Boot的启动依赖,以及mybatis-plus、druid的依赖。
4、配置文件中,我们定义了三个数据源:默认数据源、数据库连接池信息,以及SQL工厂中的数据源配置。
5、接下来,我们引入线程隔离的ThreadLocal机制,创建了一个名为DataSourceContextHolder的类,用于存储当前线程的数据源信息。
6、为了实现动态数据源切换,我们通过继承AbstractRoutingDataSource来创建DynamicRoutingDataSource类。这个类提供了一个方法用于获取数据库连接,实现了连接的创建、检查和销毁。
7、我们编写了一个配置文件,用于设置默认数据源、数据库连接池信息,以及将数据源配置到SQL工厂中。
8、核心思路是:根据datasource表中的datasourceId作为键,用于区分数据源。
9、最后,我们抽象出一个接口,提供切换数据源的方法。实现类中,我们根据传递的datasourceId查询配置表是否存在数据源信息,若存在,则检查连接是否创建,创建后完成数据源的切换。
10、测试阶段,我们对test2和test3进行了验证。在单数据源情况下,新增记录时发生异常,事务正常回滚。多数据源测试中,分别在不同数据库新增记录,发现事务回滚情况不同,这表明它们不属于同一事务处理。若需多个数据源的事务一起回滚,可能需要引入分布式事务解决方案,如Spring的全局事务JTA。但应注意,这种方法可能导致性能问题,因此在实际开发中应尽量避免。
11、至此,我们成功实现了一个简单的动态数据源切换方案,满足了业务需求。在实际应用中,还需根据具体情况进行调整和优化,以确保系统的稳定性和高效性。
二、SpringBoot+mybatis-plus+人大金仓数据库配置
配置数据源时,首先设定默认数据源或者数据源组为“master”,并启用严格匹配数据源模式,即当未匹配到指定数据源时,系统将抛出异常。具体配置如下:
primary: master#设置默认的数据源或者数据源组,默认值即为master
strict: true#严格匹配数据源,默认false。true未匹配到指定数据源时抛异常,false使用默认数据源
url: jdbc:kingbase8://127.0.0.1:54321/数据库名称?currentSchema=模式&characterEncoding=UTF-8
driver-class-name: com.kingbase8.Driver
另外,需要注意的是,使用dynamic-datasource-spring-boot-starter时,版本至少需要升级到3.5.0。
三、Spring Boot 优雅配置多数据源
1、多数据源在单一应用中意味着涉及两个或以上的数据库。配置多数据源通常涉及定义多个数据库连接属性,如url、username、password,通过创建多个DataSource来实现。此方法在不同场景下适用,如医疗系统与HIS系统的对接等。
2、使用Druid数据库连接池,配置过程包括添加依赖和全局配置文件设置。通过DruidDataSourceAutoConfigure自动配置类,使用@EnableConfigurationProperties注解确保配置文件中的配置生效。配置参数主要集中在DruidStatProperties和DataSourceProperties中,分别管理连接池参数和数据库信息。
3、Spring Boot整合Mybatis可通过依赖管理和全局配置文件实现,简化组件集成。MybatisAutoConfiguration类的配置方式基于自动配置类,使用@ConditionalOnMissingBean和@Bean注解结合,允许覆盖默认配置并注入自定义的SqlSessionFactory。
4、实现多数据源整合的关键在于抽象类AbstractRoutingDataSource,它提供了一个Map结构用于存放不同数据源,并通过determineCurrentLookupKey()方法动态选择数据源。为确保线程隔离,使用ThreadLocal存储当前数据源的键值。
5、构建动态数据源时,继承AbstractRoutingDataSource并重写determineCurrentLookupKey()方法,实现数据源切换。通过定义@SwitchSource注解和切面ASPECT,管理数据源切换的生命周期,确保事务隔离性和正确性。
6、与Mybatis集成时,使用自定义的动态数据源DynamicDataSource替换原数据源,通过全局配置文件定义数据源信息。同样地,需要重新配置事务管理器以支持多数据源环境。
7、实际应用中,使用@SwitchSource注解标注方法,实现数据源的动态切换。此方法执行时,将根据注解设置切换数据源,方法执行结束时自动恢复默认数据源。
8、总结,Spring Boot与单数据源、Mybatis、多数据源之间的整合涉及到依赖管理、配置文件设置、抽象类利用和注解实现等关键步骤。虽然多数据源的应用场景不多,但在特定领域中仍具有重要意义。