在作項目的過程當中不免會遇到這種狀況:一個項目須要兩個數據庫中的數據,但願這篇文章能給遇到這些問題的小夥伴一點幫助
java
第一步:將兩個數據源的mapper接口和xml文件分別放入不一樣的文件夾下;mysql
第二步:在application.yml文件中加入雙數據源,必定要指定主數據源,否則會報錯
spring
spring: datasource: primary: driver-class-name: com.mysql.jdbc.Driver url: url地址 username: 用戶名 password: 密碼 secondary: driver-class-name: com.mysql.jdbc.Driver url: url地址 username: 用戶名 password: 密碼
第三步:config類:
sql
@Configuration @MapperScan(basePackages = "數據源1的mapper路徑:com.dao.mapper.interface1", sqlSessionTemplateRef = "test1SqlSessionTemplate") public class DataSource1Config { @Bean(name = "test1DataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "test1SqlSessionFactory") @Primary public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/數據源1/*.xml"));//指定mapper.xml路徑 return bean.getObject(); } @Bean(name = "test1TransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test1SqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
@Configuration @MapperScan(basePackages = "數據源2的mapper路徑:com.dao.mapper.interface2", sqlSessionTemplateRef = "test2SqlSessionTemplate") public class DataSource2Config { @Bean(name = "test2DataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "test2SqlSessionFactory") public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/數據源2/*.xml"));//指定mapper.xml路徑 return bean.getObject(); } @Bean(name = "test2TransactionManager") public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test2SqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
此時,項目是能夠運行起來的,可是MySql有一個問題,就是配置雙數據源後,當鏈接池空閒時間超過8小時,數據庫鏈接就會自動斷掉,爲了不這種狀況,還須要在yml文件下加入以下配置:
數據庫
datasource: primary: max-idle: 10 max-wait: 10000 min-idle: 5 initial-size: 5 validation-query: SELECT 1 test-on-borrow: false test-while-idle: true time-between-eviction-runs-millis: 18800 #就是這句話 secondary: max-idle: 10 max-wait: 10000 min-idle: 5 initial-size: 5 validation-query: SELECT 1 test-on-borrow: false test-while-idle: true time-between-eviction-runs-millis: 18800 #就是這句話
目前配置雙數據源已經完成了。mybatis
固然,上面的配置是針對使用默認數據源的配置,可是還有不少童鞋使用了阿里的druid數據源,兩種原理基本相同,只是稍做改動:app
spring: datasource: druid: primary: driver-class-name: com.mysql.jdbc.Driver url: url地址 username: 用戶名 password: 密碼 secondary: driver-class-name: com.mysql.jdbc.Driver url: url地址 username: 用戶名 password: 密碼
在config中做以下修改:ide
將 DataSourceBuilder 改成 DuridDataSourceBuilderui