原文:https://blog.csdn.net/acquaintanceship/article/details/75350653
Spring Boot配置多數據源
配置yml文件
主數據源配置
從數據源配置
使用dao
日志
Spring Boot配置多數據源
配置yml文件
這里並沒有對spring.datasource配置數據源,因為增加新數據源后,系統會覆蓋由spring.datasource自動配置的內容。
這里自定義了兩個數據源spring.datasource.cmmi和spring.datasource.zentao
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource base: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver initialize: true #指定初始化數據源,是否用data.sql來初始化,默認: true name: cmmi url: jdbc:mysql://127.0.0.1:3306/cmmi?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull username: root password: root zentao: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver initialize: true name: zentaopro url: jdbc:mysql://127.0.0.1:3306/zentaopro?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull username: root password: root
主數據源配置
注意,配置類需要對DataSource、DataSourceTransactionManager、SqlSessionFactory 、SqlSessionTemplate四個數據項進行配置;DataSource類型需要引入javax.sql.DataSource;當系統中有多個數據源時,必須有一個數據源為主數據源,使用@Primary修飾。
@MapperScan對指定dao包建立映射,確保在多個數據源下,自動選擇合適的數據源,而在service層里不需要做特殊說明。
@Configuration @MapperScan(basePackages = "cmmi.dao.base", sqlSessionTemplateRef = "baseSqlSessionTemplate") public class BaseDataSourceConfig { @Bean(name = "baseDataSource") @ConfigurationProperties(prefix = "spring.datasource.base") @Primary public DataSource setDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "baseTransactionManager") @Primary public DataSourceTransactionManager setTransactionManager(@Qualifier("baseDataSource") DataSource dataSource) { return new DruidDataSource(); } @Bean(name = "baseSqlSessionFactory") @Primary public SqlSessionFactory setSqlSessionFactory(@Qualifier("baseDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/base/*.xml")); return bean.getObject(); } @Bean(name = "baseSqlSessionTemplate") @Primary public SqlSessionTemplate setSqlSessionTemplate(@Qualifier("baseSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
從數據源配置
@Configuration @MapperScan(basePackages = "cmmi.dao.zentao", sqlSessionTemplateRef = "zentaoSqlSessionTemplate") public class ZentaoDataSourceConfig { @Bean(name = "zentaoDataSource") @ConfigurationProperties(prefix = "spring.datasource.zentao") public DataSource setDataSource() { return new DruidDataSource(); } @Bean(name = "zentaoTransactionManager") public DataSourceTransactionManager setTransactionManager(@Qualifier("zentaoDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "zentaoSqlSessionFactory") public SqlSessionFactory setSqlSessionFactory(@Qualifier("zentaoDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/zentao/*.xml")); return bean.getObject(); } @Bean(name = "zentaoSqlSessionTemplate") public SqlSessionTemplate setSqlSessionTemplate(@Qualifier("zentaoSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
使用dao
這里只需要正常使用dao就可以了,spring會根據數據源配置的映射自動選擇相應數據源,而不需要在service做特殊說明。
@Service public class TestService { private final ZtUserMapper ztUserMapper; private final LevelDic levelDic; @Autowired public TestService(ZtUserMapper ztUserMapper, LevelDic levelDic) { this.ztUserMapper = ztUserMapper; this.levelDic = levelDic; } public void test() { ztUserMapper.selectByPrimaryKey(1); levelDic.setDicId(new Integer(1).byteValue()); } }
日志
o.a.c.c.C.[Tomcat].[localhost].[/cmmi] : Initializing Spring FrameworkServlet ‘dispatcherServlet’ o.s.web.servlet.DispatcherServlet : FrameworkServlet ‘dispatcherServlet’: initialization started o.s.web.servlet.DispatcherServlet : FrameworkServlet ‘dispatcherServlet’: initialization completed in 23 ms com.alibaba.druid.pool.DruidDataSource : {dataSource-1,cmmi} inited com.alibaba.druid.pool.DruidDataSource : {dataSource-2,zentaopro} inited