多个datasource的配置与实现原理
一般情况下,一个项目中只会有一个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时是怎么定义的接口,然后再实现该接口就可以了)。以上虽然短短几句话就说完了,以后有时间再贴出自己实现的多个数据源的实现代码。