spring boot 配置双数据源mysqlsqlServer
Posted 天道酬勤,厚德载物
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 配置双数据源mysqlsqlServer相关的知识,希望对你有一定的参考价值。
背景:原来一直都是使用mysql数据库,在application.properties 中配置数据库信息
spring.datasource.url=jdbc:mysql://xxxx/test
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=xxx
spring.datasource.password=xxx
这样spring boot会自动化配置,我们用spring boot 约定的配置,现在由于业务的需要,另加一个数据源sqlServer。下面是具体步骤以及遇到的一系列问题。
1 pom.xml文件: 2 <dependency> 3 <groupId>com.microsoft.sqlserver</groupId> 4 <artifactId>mssql-jdbc</artifactId> 5 <version>6.4.0.jre8</version> 6 <scope>runtime</scope> 7 </dependency>
1 spring.datasource.second.jdbc-url=jdbc:sqlserver://xxxxx:1433;DatabaseName=test 2 spring.datasource.second.username=xxx 3 spring.datasource.second.password=xxxx 4 spring.datasource.second.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver 5 6 注意1:连接数据库的方式不一样,mysql是/test ,sqlServer是;DatabaseName=test 7 spring.datasource.url=jdbc:mysql://xxxx/test 8 spring.datasource.second.jdbc-url=jdbc:sqlserver://xxxxx:1433;DatabaseName=test
1 package com.ieou.qmt.common; 2 import org.apache.ibatis.session.SqlSessionFactory; 3 import org.mybatis.spring.SqlSessionFactoryBean; 4 import org.springframework.beans.factory.annotation.Qualifier; 5 import org.springframework.boot.context.properties.ConfigurationProperties; 6 import org.springframework.boot.jdbc.DataSourceBuilder; 7 import org.springframework.context.annotation.Bean; 8 import org.springframework.context.annotation.Configuration; 9 import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 10 import org.springframework.core.io.support.ResourcePatternResolver; 11 import org.springframework.jdbc.core.JdbcTemplate; 12 import org.springframework.jdbc.datasource.DataSourceTransactionManager; 13 import org.springframework.transaction.PlatformTransactionManager; 14 import javax.sql.DataSource; 15 16 @Configuration 17 public class SqlServerDataSourceConfig { 18 19 @Bean(name = "sqlServerDataSource") 20 @Qualifier("sqlServerDataSource") 21 @ConfigurationProperties(prefix="spring.datasource.second") 22 public DataSource getMyDataSource(){ 23 return DataSourceBuilder.create().build(); 24 } 25 26 @Bean(name = "secondaryJdbcTemplate") 27 public JdbcTemplate secondaryJdbcTemplate( 28 @Qualifier("sqlServerDataSource") DataSource dataSource) { 29 return new JdbcTemplate(dataSource); 30 } 31 }
总结:
1 "org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 2 3 ‘org.springframework.transaction.PlatformTransactionManager‘ available at 4 5 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:347) at 6 7 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334) at 8 9 org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManage
1 spring.datasource.first.jdbc-url=jdbc:mysql://xxxx:3306/test 2 (这里要是jdbc-url,不然会报jdbcUrl is required with driverClassName的错误) 3 spring.datasource.first.type=com.alibaba.druid.pool.DruidDataSource 4 spring.datasource.first.driver-class-name=com.mysql.jdbc.Driver 5 spring.datasource.first.username=xxx 6 spring.datasource.first.password=xxx 7 8 spring.datasource.second.jdbc-url=jdbc:sqlserver://xxxx:1433;DatabaseName=test 9 spring.datasource.second.username=xxx 10 spring.datasource.second.password=xxx 11 spring.datasource.second.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
1 package com.ieou.qmt.common; 2 3 import org.apache.ibatis.session.SqlSessionFactory; 4 import org.mybatis.spring.SqlSessionFactoryBean; 5 import org.springframework.beans.factory.annotation.Qualifier; 6 import org.springframework.boot.context.properties.ConfigurationProperties; 7 import org.springframework.boot.jdbc.DataSourceBuilder; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration; 10 import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 11 import org.springframework.core.io.support.ResourcePatternResolver; 12 import org.springframework.jdbc.core.JdbcTemplate; 13 import org.springframework.jdbc.datasource.DataSourceTransactionManager; 14 import org.springframework.transaction.PlatformTransactionManager; 15 16 import javax.sql.DataSource; 17 18 @Configuration 19 public class SqlServerDataSourceConfig { 20 21 private static final String MAPPER_PATH = "classpath:mybatis/mapping/mapper/*.xml"; 22 23 private static final String ENTITY_PACKAGE = "com.ieou.qmt.mapper"; 24 25 @Bean(name = "sqlServerDataSource") 26 @Qualifier("sqlServerDataSource") 27 @ConfigurationProperties(prefix="spring.datasource.second") 28 public DataSource getMyDataSource(){ 29 return DataSourceBuilder.create().build(); 30 } 31 32 @Bean(name = "secondaryJdbcTemplate") 33 public JdbcTemplate secondaryJdbcTemplate( 34 @Qualifier("sqlServerDataSource") DataSource dataSource) { 35 return new JdbcTemplate(dataSource); 36 } 37 38 @Bean(name = "second.SqlSessionTemplate") 39 public SqlSessionFactory devSqlSessionFactory( 40 @Qualifier("sqlServerDataSource") DataSource ddataSource) 41 throws Exception { 42 final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 43 sessionFactory.setDataSource(ddataSource); 44 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 45 sessionFactory.setMapperLocations(resolver.getResources(MAPPER_PATH)); 46 sessionFactory.setTypeAliasesPackage(ENTITY_PACKAGE); 47 return sessionFactory.getObject(); 48 } 49 50 @Bean 51 public PlatformTransactionManager sqlServerTransactionManager(@Qualifier("sqlServerDataSource") DataSource sqlServerDataSource) 52 { 53 return new DataSourceTransactionManager(sqlServerDataSource); 54 } 55 56 }
1 package com.ieou.qmt.common; 2 3 import org.apache.ibatis.session.SqlSessionFactory; 4 import org.mybatis.spring.SqlSessionFactoryBean; 5 import org.springframework.beans.factory.annotation.Qualifier; 6 import org.springframework.boot.context.properties.ConfigurationProperties; 7 import org.springframework.boot.jdbc.DataSourceBuilder; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration; 10 import org.springframework.context.annotation.Primary; 11 import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 12 import org.springframework.core.io.support.ResourcePatternResolver; 13 import org.springframework.jdbc.datasource.DataSourceTransactionManager; 14 import org.springframework.transaction.PlatformTransactionManager; 15 16 import javax.sql.DataSource; 17 18 @Configuration 19 public class MysqlDataSourceConfig { 20 21 private static final String MAPPER_PATH = "classpath:mybatis/mapping/*.xml"; 22 23 private static final String ENTITY_PACKAGE = "com.ieou.qmt.mapper"; 24 25 26 @Bean(name = "dataSource") 27 @Primary 28 @Qualifier("dataSource") 29 @ConfigurationProperties(prefix="spring.datasource.first") 30 public DataSource getMyDataSource(){ 31 return DataSourceBuilder.create().build(); 32 } 33 34 @Bean(name = "first.SqlSessionTemplate") 35 @Primary 36 public SqlSessionFactory devSqlSessionFactory( 37 @Qualifier("dataSource") DataSource ddataSource) 38 throws Exception { 39 final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 40 sessionFactory.setDataSource(ddataSource); 41 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 42 sessionFactory.setMapperLocations(resolver.getResources(MAPPER_PATH)); 43 sessionFactory.setTypeAliasesPackage(ENTITY_PACKAGE); 44 return sessionFactory.getObject(); 45 } 46 47 @Bean 48 @Primary 49 public PlatformTransactionManager mysqlTransactionManager(@Qualifier("dataSource") DataSource mysqlDataSource) 50 { 51 return new DataSourceTransactionManager(mysqlDataSource); 52 } 53 }