**
1.目的
**
项目中需要连第二个数据库,去实现查询服务,方法用两个:1.另外重新写一个项目提供服务 2.在原来的项目中使用多数据源
因为只做两个查询服务,所以就不需要重新写一个服务,选择了多数据源方式
2.怎么做
0.maven配置
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
1.application.properties 写两份配置信息
spring.datasource.jiameng.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jiameng.jdbc-url=jdbc:mysql://${db.mysql.jiameng.address}:${db.mysql.jiameng.port}/${db.mysql.jiameng.database}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowMultiQueries=true
spring.datasource.jiameng.username=${db.mysql.jiameng.username}
spring.datasource.jiameng.password=${db.mysql.jiameng.password}
spring.datasource.jiameng.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.jiameng.initialSize=5
spring.datasource.jiameng.minIdle=5
spring.datasource.jiameng.maxActive=20
spring.datasource.jiameng.maxWait=60000
spring.datasource.jiameng.timeBetweenEvictionRunsMillis=60000
spring.datasource.jiameng.minEvictableIdleTimeMillis=300000
spring.datasource.jiameng.validationQuery=SELECT 1 FROM DUAL
spring.datasource.jiameng.testWhileIdle=true
spring.datasource.jiameng.testOnBorrow=false
spring.datasource.jiameng.testOnReturn=false
spring.datasource.jiameng.poolPreparedStatements=true
spring.datasource.jiameng.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.jiameng.filters=stat,wall,log4j
spring.datasource.jiameng.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.cms.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.cms.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.cms.jdbc-url=jdbc:mysql://${db.mysql.cms.address}:${db.mysql.cms.port}/${db.mysql.cms.database}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowMultiQueries=true
spring.datasource.cms.username=${db.mysql.cms.username}
spring.datasource.cms.password=${db.mysql.cms.password}
spring.datasource.cms.initialSize=5
spring.datasource.cms.minIdle=5
spring.datasource.cms.maxActive=20
spring.datasource.cms.maxWait=60000
spring.datasource.cms.timeBetweenEvictionRunsMillis=60000
spring.datasource.cms.minEvictableIdleTimeMillis=300000
spring.datasource.cms.validationQuery=SELECT 1 FROM DUAL
spring.datasource.cms.testWhileIdle=true
spring.datasource.cms.testOnBorrow=false
spring.datasource.cms.testOnReturn=false
spring.datasource.cms.poolPreparedStatements=true
spring.datasource.cms.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.cms.filters=stat,wall,log4j
spring.datasource.cms.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
2.在config配置两个数据源配置文件
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Configuration
@MapperScan(basePackages = "com.hejiameng.common.cms.persistence.mapper", sqlSessionTemplateRef = "cmsSqlSessionTemplate")
public class CmsDataSourceConfig {
// 声明bean
@Bean(name = "cmsDataSource")
// 指明读取的配置
@ConfigurationProperties(prefix = "spring.datasource.cms")
/*
* 声明数据源配置
*/
public DataSource cmsDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "cmsSqlSessionFactory")
/**
* 使用声明的数据源,创建sqlSession工厂
*/
public SqlSessionFactory cmsSqlSessionFactory(@Qualifier("cmsDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
/*
* 当mybatis采用映射配置文件的方式时,指明该数据源需要是扫描的xml文件路径
*/
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("com/hejiameng/common/cms/persistence/mapper/*.xml"));
bean.setTypeAliasesPackage("com/hejiameng/common/cms/persistence/model");
return bean.getObject();
}
@Bean(name = "cmsTransactionManager")
/**
* 声明数据源有自己的事务管理
*/
public DataSourceTransactionManager cmsTransactionManager(@Qualifier("cmsDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "cmsSqlSessionTemplate")
/**
* 声明SqlSessionTemplate由指定的SqlSession工厂创建
*/
public SqlSessionTemplate cmsSqlSessionTemplate(
@Qualifier("cmsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
@Configuration
@MapperScan(basePackages = "com.hejiameng.common.persistence.mapper", sqlSessionTemplateRef = "jiamengSqlSessionTemplate")
public class JiaMengDataSourceConfig {
// 声明bean
@Bean(name = "jiamengDataSource")
// 指明读取的配置
@ConfigurationProperties(prefix = "spring.datasource.jiameng")
// 设置为主数据源
@Primary
/*
* 声明数据源配置
*/
public DataSource jiamengDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "jiamengSqlSessionFactory")
@Primary
/**
* 使用声明的数据源,创建sqlSession工厂
*/
public SqlSessionFactory jiamengSqlSessionFactory(@Qualifier("jiamengDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
/*
* 当mybatis采用映射配置文件的方式时,指明该数据源需要是扫描的xml文件路径
*/
bean.setDataSource(dataSource);
bean.setMapperLocations( new PathMatchingResourcePatternResolver().getResources("com/hejiameng/common/persistence/mapper/*.xml"));
bean.setTypeAliasesPackage("com/hejiameng/common/persistence/model");
return bean.getObject();
}
@Bean(name = "jiamengTransactionManager")
@Primary
/**
* 声明数据源有自己的事务管理
*/
public DataSourceTransactionManager jiamengTransactionManager(@Qualifier("jiamengDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "jiamengSqlSessionTemplate")
@Primary
/**
* 声明SqlSessionTemplate由指定的SqlSession工厂创建
*/
public SqlSessionTemplate jiamengSqlSessionTemplate(
@Qualifier("jiamengSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
这里面的包名一定要对的上
**
3.修改启动方法
**
@SpringBootApplication
@ComponentScan({"com.hejiameng.common.service","com.hejiameng.web"})
//@MapperScan(basePackages = {"com.hejiameng.common.persistence.mapper","com.hejiameng.common.cms.persistence.mapper"})
@EnableCaching
@EnableTransactionManagement
@EnableScheduling
@ServletComponentScan
public class JiaMengWebApplication extends SpringBootServletInitializer {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
InputStream in = Application.class.getClassLoader().getResourceAsStream("application.properties");
properties.load(in);
SpringApplication app = new SpringApplication(Application.class);
app.setDefaultProperties(properties);
app.run(args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
builder.sources(this.getClass());
return super.configure(builder);
}
}