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

简介

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

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 共同完善这个项目。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


今天小编给大家分享的是Springboot下使用Redis管道(pipeline)进行批量操作的介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起...
本篇文章和大家了解一下springBoot项目常用目录有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。springBoot项目常用目录springBoot项...
本篇文章和大家了解一下Springboot自带线程池怎么实现。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。一: ThreadPoolTaskExecuto1 ThreadP...
这篇文章主要介绍了SpringBoot读取yml文件有哪几种方式,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Boot读取yml文件的主要方式...
今天小编给大家分享的是SpringBoot配置Controller实现Web请求处理的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧...
本篇文章和大家了解一下SpringBoot实现PDF添加水印的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。简介PDF(Portable Document Form...
本篇文章和大家了解一下解决Springboot全局异常处理与AOP日志处理中@AfterThrowing失效问题的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有...
本篇文章和大家了解一下IDEA创建SpringBoot父子Module项目的实现方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录前言1. 软硬件环...
今天小编给大家分享的是springboot获取项目目录路径的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收...
本篇内容主要讲解“SpringBoot+Spring Security无法实现跨域如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面...
这篇文章主要介绍“vue怎么发送请求到springboot程序”,在日常操作中,相信很多人在vue怎么发送请求到springboot程序问题上存在疑惑,小编查阅了各式资料,整理...
本篇内容主要讲解“Springboot内置的工具类CollectionUtils如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家...
本文小编为大家详细介绍“SpringBoot上传文件大小受限如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot上传文件大小受限如何解决”文章能帮...
本文小编为大家详细介绍“springboot拦截器如何创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“springboot拦截器如何创建”文章能帮助大家解决疑惑,下面...
本文小编为大家详细介绍“Hikari连接池使用SpringBoot配置JMX监控的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Hikari连接池使用SpringBoot配...
今天小编给大家分享一下SpringBoot如何使用Sa-Token实现权限认证的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大...
这篇文章主要介绍“SpringBoot如何集成SFTP客户端实现文件上传下载”,在日常操作中,相信很多人在SpringBoot如何集成SFTP客户端实现文件上传下...
本篇内容主要讲解“Springboot插件怎么开发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Springboot插件怎
这篇文章主要介绍“Springboot怎么解决跨域请求问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇...
今天小编给大家分享一下如何在SpringBoot2中整合Filter的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...