springboot+mybatis多數據源

首先,既然是多數據源,那麼咱們就先看下數據源怎麼配置的:java

javaconfig相似下面這樣:spring

 

MapperScan註解經常使用配置以下:sql

basePackages:Base packages to scan for MyBatis interfaces,也就是mapper接口所在包名數據庫

annotationClass:This property specifies the annotation that the scanner will search for,apache

也就是隻掃描指定包下的指定註解做爲mapper,一般爲org.apache.ibatis.annotations.Mappermybatis

markerInterface:This property specifies the parent that the scanner will search for,只掃描指定包下指定父接口的子接口做爲mapperapp

sqlSessionTemplateRef:指定這組mapper關聯的sqlSessionTemplateide

sqlSessionFactoryRef:指定這組mapper關聯的sqlSessionFactoryui

那麼,問題來了,annotationClass,markerInterface都配置了或者都不配置會怎樣?在org.mybatis.spring.annotation.MapperScannerRegistrar.registerBeanDefinitions中調用的org.mybatis.spring.mapper.ClassPathMapperScanner.registerFilters()代碼以下:3d

一幕瞭然,若是都配置了,最終的mapper會是二者匹配的合集;若是都不配置,那麼,最終的mapper會是basePackages下全部任意接口。

 

 使用地方在org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent:

 

 還有一個問題,sqlSessionTemplateRef和sqlSessionFactoryRef同時都配置了會怎樣?或者不配置呢?

一般,若是隻有一個sqlSessionFactory時是不須要配置的,只有容器中有多個時才須要指定一個。

若是都配置了呢?請看下面分析:

org.mybatis.spring.mapper.ClassPathMapperScanner.processBeanDefinitions(Set<BeanDefinitionHolder>)中處理每個以前掃描mapper生成的BeanDefinition時,會給每個BeanDefinition設置sqlSessionFactory,以下:

 

 看到log沒,很清楚:Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.

看完mapper的處理,再來看關聯的sqlSessionFactory:

根據指定數據源類型利用org.springframework.boot.jdbc.DataSourceBuilder建立dataSource,目前主流的是使用阿里開源的Druid數據庫鏈接池做爲數據源:

 

sqlSessionFactory建立:

經過SqlSessionFactoryBean關聯dataSource和MapperXML,再經過@MapperScan關聯sqlSessionFactory和mapper接口

 

 

 至此,單個數據源建立算是完成了。如題,多數據源怎麼辦?

方法一,手動配置多個dataSource,並在@MapperScan關聯不一樣的sqlSessionFactory和mapper接口。

方法二,動態數據源,繼承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,重寫determineTargetDataSource方法,從targetDataSources中獲取對應數據源操做數據庫,一般在前面業務代碼根據具體怎樣的狀況選擇怎樣的dataSource,而後經過設置ThreadLocal變量,這裏獲取變量信息來返回對應數據源。切入業務邏輯能夠經過aop切面從dao層方法名入手,也能夠經過mybatis的攔截器獲取sql信息和入參決定選擇哪一個數據源。

 PS:若是是讀寫分離,一般狀況下主庫讀寫權限,從庫只讀權限,事務DataSourceTransactionManager配置在主庫的dataSource上,@Transactional會自動從配置事務的dataSource中獲取鏈接。

相關文章
相關標籤/搜索