Spring数据库多数据源路由配置过程图解_java

来源:脚本之家  责任编辑:小易  

我首先想到在spring的applicationContext中配置所有的dataSource。这些dataSource可能是各种不同类型的,比如不同的数据库:Oracle、SQL Server、MySQL等,也可能是不同的数据源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然后sessionFactory根据客户的每次请求,将dataSource属性设置成不同的数据源,以到达切换数据源的目的。但是,我很快发现一个问题:当多用户同时并发访问数据库的时候会出现资源争用的问题。这都是“单例模式”惹的祸。众所周知,我们在使用spring框架的时候,在beanFactory中注册的bean基本上都是采用单例模式,即spring在启动的时候,这些bean就装载到内存中,并且每个bean在整个项目中只存在一个对象。正因为只存在一个对象,对象的所有属性,更准确说是实例变量,表现得就如同是个静态变量(实际上“静态”与“单例”往往是非常相似的两个东西,我们常常用“静态”来实现“单例”)。拿我们的问题来说,sessionFactory在整个项目中只有一个对象,它的实例变量dataSource也就只有一个,就如同一个静态变量一般。如果不同的用户都不断地去修改dataSource的值,必然会出现多用户争用一个变量的问题,对系统产生隐患。通过以上的分析,解决多数据源访问问题的关键,就集中在sessionFactory在执行数据持久化的时候,能够通过某段代码去根据客户的需要动态切换数据源,并解决资源争用的问题。采用Decorator设计模式要解决这个问题,我的思路锁定在了这个dataSource上了。如果sessionFactory指向的dataSource可以根据客户的需求去连接客户所需要的真正的数据源,即提供动态切换数据源的功能,那么问题就解决了。那么我们怎么做呢?去修改那些我们要使用的dataSource源码吗?这显然不是一个好的方案,我们希望我们的修改与原dataSource代码是分离的。根据以上的分析,使用GoF设计模式中的Decorator模式(装饰者模式)应当是我们可以选择的最佳方案。什么是“Decorator模式”?简单点儿说就是当我们需要修改原有的功能,但我们又不愿直接去修改原有的代码时,设计一个Decorator套在原有代码外面。当我们使用Decorator的时候与原类完全一样,当Decorator的某些功能却已经修改为了我们需要修改的功能。Decorator模式的结构如图。我们本来需要修改图中所有具体的Component类的一些功能,但却并不是去直接修改它们的代码,而是在它们的外面增加一个Decorator。Decorator与具体的Component类都是继承的AbstractComponent,因此它长得和具体的Component类一样,也就是说我们在使用Decorator的时候就如同在使用ConcreteComponentA或者ConcreteComponentB一样,甚至那些使用ConcreteComponentA或者ConcreteComponentB的客户程序都不知道它们用的类已经改为了Decorator,但是Decorator已经对具体的Component类的部分方法进行了修改,执行这些方法的结果已经不同了www.zgxue.com防采集请勿采集本网。

项目中需要根据不同业务进行分库,首先是将业务不同业务映射到不同过的数据库( biz --> db,可能存在多对一情况),

众所周知,我们在使用spring通过以上的分析,解决多数据源访问问题的关键,就集中在sessionFactory(一)采用Decorator设计模式 要解决这个问题,我的思路锁定在了这个dataSource什么是“(二)设计

查看springjdbc源码发现AbstractRoutingDataSource类作为一个数据源路由抽象类,可以担当这个事情,其设计思想也比较简单,

这是我之前写的一个在xml文件中配置oracle数据源的部分代码,由于我是用了分散配置,所以vaule=的值是在另外一个文件中,lz可以直接将相关信息硬编码进去

首先将多个数据源的映射关系自己维护完成后注入进来,然后自己定义一个路由规则,重点部分见代码:

在 我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往 在 spring 和 hibernate 框架中总是配置一个数据源,因而

首先可以看到该类是一个抽象类,重点关注变量targetDataSource和resolvedDataSources.

我首先想到在spring的applicationContext中配置所有的dataSource。这些dataSource可能是各种不同类型的,比如不同的数据库:Oracle、SQL Server、MySQL等,也可能是不同的数据源:比如apache

其中targetDataSource用于将用户建立的映射关系注入进来,可以通过如下方法

1.定义两个DAO分别使用不同的数据源,ADAO连接A数据库,BDAO连接B数据库 2.定义一个Service类,加上Spring注解@Transactional,表示进行事务管理。事务要配置成jta分布式事务。将ADAO和BDAO注入

resolvedDataSources用于真正存储依赖关系,targetDataSource仅仅是个中介,解析代码见下图

核心路由方法:

是不是很清楚,首先获取数据源映射key,然后通过key获取数据源

数据源映射获取方法为抽象方法,见下图:

实现时需要注意线程安全,最佳实现时通过ThreadLocal将在dbsql执行前将key设置进去,以便后来获取这个key,

调用入口:

我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往 在 spring 和 hibernate 框架中总是配置一个数据源在 我们的项目中遇到这样一个问题:如何让 sessionFactory 在执 行数据持久化的时候,更准确说是实例变量,sessionFactory 在整个项目中只有一 个对象.springframework,通过它来动态切换数据源。同时在配置文件中将sessionFactory的dataSource属性由原来的某个具体的dataSource改为MultiDataSource,根据客户的需求能够动态切换不同的数据源,同时,我们又希望使用 dataSource 的 sessionFactory 根本就感觉不到这样的变 化。Decorator 模式就正是解决这个问题的设计模式。首先写一个 Decorator 类,我取名叫 MultiDataSource.commons。当我们使用 Decorator 的时候与原类完全一样,当 Decorator 的某些功能却已经修改为了我们需要修改的功 能。如图:内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • springboot项目application.yml文件数据库配置密码加密的方法
  • spring security使用数据库认证及用户密码加密和解密功能
  • springboot2 整合 clickhouse数据库案例解析
  • springboot配置文件中数据库密码加密两种方案(推荐)
  • springboot整合druid数据源过程详解
  • springboot 多数据源的实现(最简单的整合方式)
  • springmvc mybatis配置多个数据源并切换代码详解
  • springboot如何在运行时动态添加数据源
  • java中的io(input与output)操作总结(一)
  • 详解java基础--提示对话框的使用
  • java实现简易生产者消费者模型过程解析
  • 详解hdfs多文件join操作的实例
  • spring boot集成pagehelper(两种方式)
  • spring mvc json数据交换格式原理解析
  • java使用poi读取excel内容方法实例
  • java面试题之基本语法(图解)
  • springboot解决ajax+自定义headers的跨域请求问题
  • java实现用户不可重复登录功能
  • 如何在spring框架中解决多数据源的问题
  • 如何在spring框架中解决多数据源的问题
  • spring+mybatis怎么配置一个数据源,多个数据库
  • spring+mybatis怎么配置一个数据源,多个数据库
  • 如何在spring框架中解决多数据源的问题
  • spring+mybatis怎么配置一个数据源,多个数据库
  • 如何在spring框架中解决多数据源的问题
  • 如何在spring框架中解决多数据源的问题
  • spring+mybatis 多数据库事务管理:一个方法里面能同时对两个数据源的数据进行操作,这两个数据库中的表
  • Spring 中数据源和数据库连接池配置的几种
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页springboot项目application.yml文件数据库配置密码加密的方法spring security使用数据库认证及用户密码加密和解密功能springboot2 整合 clickhouse数据库案例解析springboot配置文件中数据库密码加密两种方案(推荐)springboot整合druid数据源过程详解springboot 多数据源的实现(最简单的整合方式)springmvc mybatis配置多个数据源并切换代码详解springboot如何在运行时动态添加数据源java中的io(input与output)操作总结(一)详解java基础--提示对话框的使用java实现简易生产者消费者模型过程解析详解hdfs多文件join操作的实例spring boot集成pagehelper(两种方式)spring mvc json数据交换格式原理解析java使用poi读取excel内容方法实例java面试题之基本语法(图解)springboot解决ajax+自定义headers的跨域请求问题java实现用户不可重复登录功能java使double保留两位小数的多方java8 十大新特性详解java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法javaweb实现文件上传下载功能实例java 字符串截取的三种方法(推荐idea配置使用maven helper插件的方法(详细java数据封装树形结构代码实例java中spring读取配置文件的几种方法示例mybatis拦截器与分页插件实例教程springboot集成swaggerui以及启动时遇到的java设计模式之装饰器模式(decorator)java设计模式之模板模式(template模式)springboot 多任务并行+线程池处理的实现myeclipse8.5优化技巧详解java读取本地json文件及相应处理方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved