通常我们一个项目可能存在开发、联调、测试、线上等环境,那么我们使用SpringBoot的工作环境切换配置会很方便,首先新建一个application-dev.properties开发环境文件,然后再application.properties主文件中使用spring.profiles.active=dev引入开发环境配置即可。
下面开始详解多数据源的配置:
1.在application-dev.properties中写入
-
#mysql x1
-
spring.datasource.url=xxx
-
spring.datasource.username=xxx
-
spring.datasource.password=xxx
-
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-
#mysql x2
-
spring.datasource-wmatch.url=xxx
-
spring.datasource-wmatch.username=xxx
-
spring.datasource-wmatch.password=xxx
-
spring.datasource-wmatch.driver-class-name=com.mysql.jdbc.Driver
-
#mysql x3
-
spring.datasource-match.url=xxx
-
spring.datasource-match.username=xxx
-
spring.datasource-match.password=xxx
-
spring.datasource-match.driver-class-name=com.mysql.jdbc.Driver
2.
-
@Configuration
-
// Springboot多数据源获取配置基类
-
public class DataSourceConfig {
-
//get set 对应配置文件中的4个属性
-
private String url;
-
private String username;
-
private String password;
-
private String driverClassName;
-
@Bean(name = "micDataSource")
-
@Primary //主数据源
-
@ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource")
-
public DataSource micDataSource() {
-
return DataSourceBuilder.create().build();
-
}
-
@Bean(name = "wmatchDataSource")
-
@ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource-wmatch")
-
public DataSource wmatchDataSource() {
-
return DataSourceBuilder.create().build();
-
}
-
@Bean(name = "matchDataSource")
-
@ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource-match")
-
public DataSource matchDataSource() {
-
return DataSourceBuilder.create().build();
-
}
-
//拿到不同数据源的SessionFactory
-
@Bean(name = "micSessionFactory")
-
@Primary
-
public LocalSessionFactoryBean micSessionFactory(@Qualifier("micDataSource") DataSource dataSource) {
-
LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
-
bean.setDataSource(dataSource);
-
return bean;
-
}
-
@Bean(name = "wmatchSessionFactory")
-
public LocalSessionFactoryBean wmatchSessionFactory(@Qualifier("wmatchDataSource") DataSource dataSource) {
-
LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
-
bean.setDataSource(dataSource);
-
return bean;
-
}
-
@Bean(name = "matchSessionFactory")
-
public LocalSessionFactoryBean matchSessionFactory(@Qualifier("matchDataSource") DataSource dataSource) {
-
LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
-
bean.setDataSource(dataSource);
-
return bean;
-
}
-
/**
-
* @return the url
-
*/
-
public String getUrl() {
-
return url;
-
}
-
/**
-
* @param url
-
* the url to set
-
*/
-
public void setUrl(String url) {
-
this.url = url;
-
}
-
/**
-
* @return the username
-
*/
-
public String getUsername() {
-
return username;
-
}
-
/**
-
* @param username
-
* the username to set
-
*/
-
public void setUsername(String username) {
-
this.username = username;
-
}
-
/**
-
* @return the password
-
*/
-
public String getPassword() {
-
return password;
-
}
-
/**
-
* @param password
-
* the password to set
-
*/
-
public void setPassword(String password) {
-
this.password = password;
-
}
-
/**
-
* @return the driverClassName
-
*/
-
public String getDriverClassName() {
-
return driverClassName;
-
}
-
/**
-
* @param driverClassName
-
* the driverClassName to set
-
*/
-
public void setDriverClassName(String driverClassName) {
-
this.driverClassName = driverClassName;
-
}
-
}
以上配置已经结束,只需要在使用的地方进行针对不同SessionFactory的注入即可,注入关键字@Qualifier
@Configuration @EnableJpaRepositories(entityManagerFactoryRef = "localContainerEntityManagerFactoryBean" , basePackages = "com.newframe.repositories.dataMaster", repositoryBaseClass = BaseRepositoryEx.class) public class MasterRepositoryConfig { @Autowired @Qualifier("masterDataSource") private DataSource masterDS; @Autowired private JpaProperties jpaProperties; @Primary @Bean("entityManager") public EntityManager entityManager(EntityManagerFactoryBuilder builder){ return localContainerEntityManagerFactoryBean(builder).getObject().createEntityManager(); } @Primary @Bean("localContainerEntityManagerFactoryBean") public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(EntityManagerFactoryBuilder entityManagerFactoryBuilder){ return entityManagerFactoryBuilder.dataSource(masterDS) .properties(getProperties()) .packages("com.newframe.entity") .persistenceUnit("primaryPersistenceUnit") .build(); } private Map<String, Object> getProperties(){ return jpaProperties.getHibernateProperties(new HibernateSettings()); } }