热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过注解巧妙应对SpringBoot与MyBatis多数据源配置挑战

在近期的项目开发过程中,ORM层采用了MyBatis,并且需要连接多个数据库,这带来了多数据源配置的挑战。为了解决这一问题,我们可以通过巧妙运用注解来实现优雅的数据源切换,确保系统的灵活性和可维护性。这种方法不仅简化了配置,还提高了代码的可读性和扩展性。

最近在开发项目中(ORM层用的是mybatis),需要连接多个数据库,这时候就涉及到多数据源使用了。为了优雅的解决此问题,我们可以使用装饰者模式并修改了mybatis的实现源码来优雅的解决此问题 由于代码量有点多,文章篇幅有限,就不在此详细的搬出,具体的代码已放到git 飞机票如下https://github.com/skybluehhx/mulitDataSource.git(现已更新支持注解的方式)。

 首先回顾下数据也就是DataSource这个接口的作用

public interface DataSource extends CommonDataSource, Wrapper {/*** 尝试使用该数据源去获取连接*/Connection getConnection() throws SQLException;/*** */Connection getConnection(String username, String password)throws SQLException;
}

  假设现在我们有两个数据源A和B,我们可以使用自写一个数据源实现C,根据我们的需求从A或B中去获取具体实现,伪代码如下

 

/*** @author jianglinzou* @date 2019/7/4 下午7:52*/
public class C implements DataSource {private DataSource A;private DataSource B;@Overridepublic Connection getConnection() throws SQLException {return null;}@Overridepublic Connection getConnection(String username, String password) throws SQLException {if (需要获取A数据源的连接) {return A.getConnection(username, password);} else if (需要获取B数据源的连接) {return B.getConnection(username, password);}return null;}//其他方法略
}

首先,根据我们的请求依据什么去获取具体的数据源连接,这个可以在request中确定,当发起请求时,我们需要自己去设置请求的数据源,

第二,由于request位于controller层,如何无缝的从request中获取需要请求的数据源名称呢,答案是通过threadlocal类,当请求来临时,我们从request中获取需要的数据名称,并放入threadlocal中,由于执行该方法与放入threadlocal的线程为同一线程,获取时我们直接从threadlocal中获取中即可。核心代码如下

 

//拦截器,从request中获取需要的数据源名称@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {String dataSource = request.getParameter(DATA_SOURCE_PARAM_NAME);if (Strings.isBlank(dataSource)) {dataSource = request.getHeader(DATA_SOURCE_PARAM_NAME);}//该方法将需要的dataSource放入threadlocal中国MulitDataSourceSupport.putDataSourceName(request, dataSource);return true;}获取连接public Connection getConnection(String username, String password) throws SQLException {DataSource dataSource = getDataSource();return dataSource.getConnection(username, password);}protected DataSource getDataSource() {String dataSourceName = MulitDataSourceSupport.getDataSourceName();logger.info("will to get dataSourceName:{}", dataSourceName);DataSource dataSource = getDataSourceFromApplication(dataSourceName);return dataSource;}

另一种方式是依托于注解,这里就不演示了,大家可以https://github.com/skybluehhx/mulitDataSource.git上获取完整代码

上述就是多数据源配置的核心代码,巧妙的运用了装饰者模式来解决实际问题,上述只是简单的讲解,大家获取完整的代码。根据readme提示运行实例即可。

 

 


推荐阅读
  • Flutter入门指南:实现自动关闭的对话框与提示
    本文为Flutter系列教程的一部分,专注于讲解如何在Flutter应用中实现自动关闭的对话框和提示。通过具体的代码示例,帮助开发者掌握SnackBar、BottomSheet和Dialog的使用方法。 ... [详细]
  • 学习目的:1.了解android线程的使用2.了解主线程与子线程区别3.解析异步处理机制主线程与子线程:所谓主线程,在Windows窗体应用程序中一般指UI线程,这个是程序启动的时 ... [详细]
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
  • 本文介绍了在 Android 开发中如何实现像素 (px)、缩放独立像素 (sp) 和密度独立像素 (dp) 之间的相互转换。这些方法对于确保应用在不同屏幕尺寸和分辨率上的适配至关重要。 ... [详细]
  • 应用程序配置详解
    本文介绍了配置文件的关键特性及其在不同场景下的应用,重点探讨了Machine.Config和Web.Config两种主要配置文件的用途和配置方法。文章还详细解释了如何利用XML格式的配置文件来调整应用程序的行为,包括自定义配置、错误处理、身份验证和授权设置。 ... [详细]
  • 本文介绍了一个使用Keras框架构建的卷积神经网络(CNN)实例,主要利用了Keras提供的MNIST数据集以及相关的层,如Dense、Dropout、Activation等,构建了一个具有两层卷积和两层全连接层的CNN模型。 ... [详细]
  • 本文探讨了在Java应用中,由于对象间循环引用导致重写toString方法时出现StackOverflowError的具体情况,并提供了有效的解决方案。 ... [详细]
  • 使用DataGridViewComboBoxColumn实现数据绑定与操作
    本文详细介绍如何在DataGridView中使用DataGridViewComboBoxColumn来加载、选择和保存数据库中的数据,提供具体的实现步骤和示例代码。 ... [详细]
  • 本文详细介绍了如何通过 `vue.config.js` 文件配置 Vue CLI 的打包和代理设置,包括开发服务器配置、跨域处理以及生产环境下的代码压缩和资源压缩。 ... [详细]
  • 重构:优化现有代码设计(第二版)笔记
    本文介绍了重构的基本概念,通过具体示例展示了如何提炼函数以处理过长的代码段,并探讨了多种重构技术,如分阶段重构、封装变量等。 ... [详细]
  • 本文由Jogis撰写,详细探讨了React中的组件设计模式,包括控制组件、非控制组件及混合模型组件,分析了各自的优缺点及其应用场景。 ... [详细]
  • 本文探讨了在Java应用中实现线程池优雅关闭的两种方法,包括使用ShutdownHook注册钩子函数以及通过SignalHandler处理信号量。每种方法都提供了具体的代码示例,并讨论了可能遇到的问题及解决方案。 ... [详细]
  • 使用Python轻松合并大量复杂Excel文件
    当面对大量的Excel文件时,如何高效地将它们合并成一个文件成为了一项挑战。本文将指导初学者如何利用Python的几个库,在几十行代码内完成这一任务。 ... [详细]
  • 本文深入探讨了企业级开发框架NHibernate和Spring.NET的关键特性之一——面向方面编程(AOP)。文章不仅介绍了AOP的基本概念及其如何增强面向对象编程(OOP),还详细说明了Spring.NET中AOP的具体应用,包括事务管理和自定义方面的实现。 ... [详细]
  • UnityNGUIScrollView苹果式滑动
    又回来写博客了,这回已经开始上班了,所以就发一发工作中解决的难题吧。单个展示Panel(苹果式)以前对UI的滑动组件很烦心,不是很会用,这回项目要求写一个类似于苹果的文件滑动效果, ... [详细]
author-avatar
wuqing0625
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有