一般情况下,一个项目中只会有一个datasource,但是在某些情况、或者业务需求的情况下会出现一个项目有多个datasource的情况,当满足一定条件的时候,对数据库的操作就会从一个一个datasource切换到另一个datasource.
那么这种多数据源的配置与实现原理是什么样的?
    
一、spring boot 下配置多个数据源:
 
二、实现原理:
        目前持久层框架常用的就是mybatis与hibernate, 与数据库进行交互的工作就是持久层框架做的事。要连接到数据库,就需要数据库的url,端口,密码等信息,这些信息的抽象出来我们就叫做数据源,也就是datasource,下面是常见datasource的一种配置:
    
上图是yml格式的配置,也有xml、properties等格式。格式不同,但核心是一样的,就是保存连接数据库的各种必要信息。当spring框架或者其他框架扫描到个datasource的配置,就会根据这个配置生成一个datasource的bean实例。
     而持久层框架进行了一系列准备工作后,需要将sql语句发送到数据库,那么这个时候就需要使用datasource, 其中最核心的就是持久层框架定义了一个 Transaction接口,这个Transcation接口有个getConnection()方法,内容就是从datasource中获取一个与数据库的Connection,通过操作这个Connection将数据发送到数据库:
    mybatis定义的transaction:
 
Hibernate定义的transaction接口,与mybatis有一些区别,但是在核心方法commit上,都是在操作connection对象:
 
多个Transaction接口、类的定义:
,从上图可以看出,transaction这个定义在很多地方使用。实际上,只要是需要通过网络进行通信的功能,都会有这么一个类似datasource的东西来存储通信时的必要配置信息(url、端口、超时时间、协议等等···),这个东西可能叫做datasource,也可能叫做其他名字,但他其实底层本质就是一个socket,通过层层封装与抽象来提供给大家使用。
 所以就算不使用spring boot的那一套配置,自己也能实现多数据源的切换,无非就是先定义多个datasource的bean实例出来,然后根据项目中使用的持久层框架的不同来重写Transaction接口中的方法(也可能是其他接口,主要是看框架操作datasource时是怎么定义的接口,然后再实现该接口就可以了)。以上虽然短短几句话就说完了,以后有时间再贴出自己实现的多个数据源的实现代码。
 

多个datasource的配置与实现原理的更多相关文章

  1. 在Sping的配置文件中,关于dataSource的配置,就我们常用的方法大致可以有三种:

    在Sping的配置文件中,关于dataSource的配置,就我们常用的方法大致可以有三种: 1.一般的配置方法,直接在配置中指定其值.具体的例子我们参照Mysql的配置如下: <bean id= ...

  2. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  3. SpringCloud 详解配置刷新的原理 使用jasypt自动加解密后 无法使用 springcloud 中的自动刷新/refresh功能

    之所以会查找这篇文章,是因为要解决这样一个问题: 当我使用了jasypt进行配置文件加解密后,如果再使用refresh 去刷新配置,则自动加解密会失效. 原因分析:刷新不是我之前想象的直接调用conf ...

  4. SSH免密登陆配置过程和原理解析

    SSH免密登陆配置过程和原理解析 SSH免密登陆配置过很多次,但是对它的认识只限于配置,对它认证的过程和基本的原理并没有什么认识,最近又看了一下,这里对学习的结果进行记录. 提纲: 1.SSH免密登陆 ...

  5. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解(转)

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  6. hystrix ,feign,ribbon的超时时间配置,以及原理分析

    背景,网上看到很多关于hystrix的配置都是没生效的,如: 一.先看测试环境搭建: order 服务通过feign 的方式调用了product 服务的getProductInfo 接口 //---- ...

  7. oozie配置安装与原理

     概述 当前开源的hadoop任务工作流管理主要有oozie和Azkaban,本文先介绍oozie的配置安装与基本运行原理. 配置安装 (参考https://segmentfault.com/a/11 ...

  8. Hadoop第一式:配置Linux环境之免密配置及SSH原理

    一.配置SSH免密登录 进入/.ssh目录,执行密钥生成指令 ssh-keygen -t rsa (rsa为默认加密格式) 然后会出现四个提示,让你选择密钥保存路径.指纹.拍照啥的,不用管它直接回车过 ...

  9. 尚硅谷springboot学习26-嵌入式servlet容器自动配置、启动原理

    EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置 @AutoConfigureOrder(Ordered.HIGHEST_PREC ...

随机推荐

  1. Hadoop2.8.2 运行wordcount

    1 例子jar位置 [hadoop@hadoop02 mapreduce]$ pwd /hadoop/hadoop-2.8.2/share/hadoop/mapreduce [hadoop@hadoo ...

  2. boost.asio新框架的设计概念总结

    1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...

  3. PL真有意思(三):名字、作用域和约束

    前言 这两篇写了词法分析和语法分析,比较偏向实践.这一篇来看一下语言设计里一个比较重要的部分:名字.在大部分语言里,名字就是标识符,如果从抽象层面来看名字就是对更低一级的内存之类的概念的一层抽象.但是 ...

  4. c#-EntitySet<TEntity>

    MSDN 解释: https://msdn.microsoft.com/zh-cn/library/bb341748.aspx 为 LINQ to SQL 应用程序中的一对多关系和一对一关系的集合方提 ...

  5. Vue组件通信之非父子组件传值

    前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是 ...

  6. Java线程池实现

    电脑的CPU资源是有限的,任务的处理速度与线程数量之间并不是正相关.当线程数量过多,CPU要频繁的在不同线程切换,反而会引起处理性能的下降.线程池中最大的线程数,是考虑多种因素来事先设定的,比如硬件的 ...

  7. Prometheus 【目录】

    正在陆续更新,内容大体包括: rule.标签重置.cAdversior.自动发现(File 自动发现.DNS自动发现.k8s环境自动发现)等... 目录: prometheus[第一篇] Promet ...

  8. 5、Docker 核心原理-资源隔离和限制

    Docker 资源隔离 Docker 是利用linux的LXC技术,内核的Kernel namespace Namespace: PID - 通过PID的namespace隔离,可以嵌套 NET - ...

  9. polygon()函数

    polygon():draw the polygons where vertices are given in x and y. polygon(x,y=NULL,density=NULL,angle ...

  10. python_tornado

    1.创建Tornado服务器    1.创建Application对象        Application是Torando最核心的类        所有关于服务器的配置信息都写在Applicatio ...