springboot 多数据源的实现(最简单的整合方式)

作者:louislivi 时间:2022-08-20 02:30:11 

简介

相信大家有配置过多数据源,或者即将配置多数据的朋友们,会发现网上大概有以下几种方案:

1. 使用 AOP 切片进行动态数据源切换
2. 使用 MapperScan 的 basePackages 配置不同的 mapper 目录以及 template
3. 数据库代理中间件

这两种方式都能实现多数据源但是各有缺点:

1. 无法实现多数据源 XA 事物(全局事物管理 |JTA)这个缺点非常致命,配了多数据源但是没有全局事物那有什么用纯属坑爹,网上还有很多帖子教程使用这种虽然配置稍微简单但是如果你要用到全局事物根本没有用。

2. 这种方式是可以结合 JTA 实现全局事物,目前本人在业务中也采用这种方式在线上跑,经过多次调试以及线上运维有一点问题不可置疑就是麻烦!你会遇到需要整合 druid 连接池,还有全局事物如果你找网上帖子跟着流程走配完多多少少可能还是有些小问题。

3. 数据源代理可能是很好的一种方式,大多巨头公司都是采用这种方式,而且开发业务人员不用再考虑这些问题,使用代理进行切割以及连接池等都能实现,但是有一个很尴尬的问题就是开源的不好用,因为很多不适合自身的业务,而且自己开发也不现实成本过高。

这时候我在考虑一个问题,为什么不可以像其他语言框架一样直接引入一个依赖在 yml 文件中配置就可以了呢,所有就有了现在的最简方案。

源码地址

希望大家可以 star 支持一下,后续还会加入其它依赖的简易整合。
https://github.com/louislivi/fastdep

开始

版本:
springboot:2.0+

引入依赖:
Maven


<dependency>
<groupId>com.louislivi.fastdep</groupId>
<artifactId>fastdep-datasource</artifactId>
<version>1.0.0</version>
</dependency>

Gradle


compile group: 'com.louislivi.fastdep', name: 'fastdep-datasource', version: '1.0.0'

application.yml 配置文件:


fastdep:
datasource:
 test: #数据源名称可随意取
  mapper: com.louislivi.fastdep.test.mapper.test #当前数据源对应的mapper目录不能多个数据源相同
  password: 123456
  url: jdbc:mysql://127.0.0.1:3306/douyin?serverTimezone=Asia/Chongqing&useLegacyDatetimeCode=false&nullNamePatternMatchesAll=true&zeroDateTimeBehavior=CONVERT_TO_NULL&tinyInt1isBit=false&autoReconnect=true&useSSL=false&pinGlobalTxToPhysicalConnection=true
  driverClassName: com.mysql.cj.jdbc.Driver
  username: root
#   # 下面为druid连接池的补充设置
#   initialSize: 10
#   minIdle: 5
#   maxActive: 100
#   connectionInitSqls: 'set names utf8mb4;'
 test2: #数据源名称可随意取
  mapper: com.louislivi.fastdep.test.mapper.test2 #当前数据源对应的mapper目录不能多个数据源相同
  password: 123456
  url: jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=Asia/Chongqing&useLegacyDatetimeCode=false&nullNamePatternMatchesAll=true&zeroDateTimeBehavior=CONVERT_TO_NULL&tinyInt1isBit=false&autoReconnect=true&useSSL=false&pinGlobalTxToPhysicalConnection=true
  driverClassName: com.mysql.cj.jdbc.Driver
  username: root
#   # 下面为druid连接池的补充设置
#   initialSize: 10
#   minIdle: 5
#   maxActive: 100
#   connectionInitSqls: 'set names utf8mb4;'

这就结束了?

没错就是这么简单。

是不是很简单,你去网上招贴子你会发现大同小异都是教你一直加文件进行配置,如果是 MapperScan 加一个数据源,每次都要又加一个 java 类。

原理

使用 ImportBeanDefinitionRegistrar BeanDefinitionBuilder.genericBeanDefinition 动态注入 Bean 其实很简单有兴趣可以去看看源码。

最后

防止有其他问题贴出我完整 pom.xml 下引入的依赖:


<dependencies>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     <version>2.1.5.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.11</version>
   </dependency>
   <dependency>
     <groupId>com.louislivi.fastdep</groupId>
     <artifactId>fastdep-datasource</artifactId>
     <version>1.0.0</version>
   </dependency>
 </dependencies>

希望大家能够支持开源,给个小星星,后续还会继续开发其他依赖的整合以及目前多数据的优化后续支持 Hibernate 等,甚至兼容其他框架使用。fastdep 让 java 整合依赖更简单。在此也招募有志同道合的 coder 共同完善这个项目。

来源:https://learnku.com/articles/36810

标签:spring,boot,多数据源
0
投稿

猜你喜欢

  • 通过Java连接SQL Server数据库的超详细操作流程

    2022-08-01 12:46:01
  • Android中使用Gson解析JSON数据的两种方法

    2021-10-13 23:25:39
  • Python基础教程学习笔记 第一章 基础知识

    2023-12-28 17:45:56
  • IntelliJ IDEA 关闭多余项目的操作方法

    2022-02-11 04:55:13
  • Android三种常见的图片压缩方式

    2022-12-21 06:03:59
  • 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    2023-08-08 14:38:37
  • 安卓(Android)游戏开发音效代码

    2023-11-15 14:47:58
  • Android Data Binding 在 library module 中遇到错误及解决办法

    2021-08-31 12:16:31
  • OpenHarmony实现屏幕亮度动态调节方法详解

    2022-01-13 18:24:08
  • javaweb前端向后端传值的几种方式总结(附代码)

    2022-04-28 09:21:29
  • Android中父View和子view的点击事件处理问题探讨

    2022-06-19 04:26:47
  • C++类中的static和const用法实例教程

    2023-07-03 23:19:07
  • C#修改IIS站点framework版本号的方法

    2023-08-29 19:14:13
  • Android系统自带分享图片功能

    2022-08-03 09:14:07
  • 浅析C# Dynamic关键字

    2022-11-24 03:01:42
  • Android自定义listview布局实现上拉加载下拉刷新功能

    2023-05-12 23:27:28
  • Java语法基础之运算符学习笔记分享

    2021-12-18 02:13:17
  • c++传递函数指针和bind的示例

    2021-06-18 18:34:38
  • Android基于SoftReference缓存图片的方法

    2023-07-13 00:53:21
  • Unity查找游戏物体的六种方式详解

    2021-07-09 18:23:17
  • asp之家 软件编程 m.aspxhome.com