1.application.yml配置文件
spring:
profiles: test
datasource:
primary:
url: jdbc:mysql://127.0.0.1:3306/ww_spider?autoReconnect=true&useSSL=false&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
max-active: 20
max-idle: 8
min-idle: 8
initial-size: 10
secondary:
url: jdbc:mysql://127.0.0.1:3306/zhxg?autoReconnect=true&useSSL=false&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
max-active: 20
max-idle: 8
min-idle: 8
initial-size: 10
jpa:
database: mysql
show-sql: true
2.配置DataSourcesConfig类:
@Configuration
public class DataSourcesConfig {
@Bean
@Primary
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSourceProperties primaryDataSourceProperties(){
return new DataSourceProperties();
}
@Bean
@Primary
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource(@Value("${spring.datasource.primary.url}") String url,
@Value("${spring.datasource.primary.username}") String userName,
@Value("${spring.datasource.primary.password}") String pass,
@Value("${spring.datasource.primary.driver-class-name}") String className) {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setJdbcUrl(url);
hikariDataSource.setDriverClassName(className);
hikariDataSource.setUsername(userName);
hikariDataSource.setPassword(pass);
return hikariDataSource;
//return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSourceProperties secondaryDataSourceProperties(){
return new DataSourceProperties();
}
@Bean
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource(@Value("${spring.datasource.secondary.url}") String url,
@Value("${spring.datasource.secondary.username}") String userName,
@Value("${spring.datasource.secondary.password}") String pass,
@Value("${spring.datasource.secondary.driver-class-name}") String className){
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setJdbcUrl(url);
hikariDataSource.setDriverClassName(className);
hikariDataSource.setUsername(userName);
hikariDataSource.setPassword(pass);
return hikariDataSource;
//return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
}
3.配置主数据源PrimaryConfig类
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryPrimary",
transactionManagerRef="transactionManagerPrimary",
basePackages= { "spring.boot.repository.primary" }) //设置Repository所在位置
public class PrimaryConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Autowired(required=false)
private JpaProperties jpaProperties;
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(primaryDataSource)
.properties(getVerdorProperties())
.packages("spring.boot.entity.primary") //设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
}
public Map<String, Object> getVerdorProperties(){
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
4.配置第二数据源SecondaryConfig类:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactorySecondary",
transactionManagerRef="transactionManagerSecondary",
basePackages= { "spring.boot.repository.secondary" }) //设置Repository所在位置
public class SecondaryConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Autowired(required=false)
private JpaProperties jpaProperties;
@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource)
.properties(getVerdorProperties())
.packages("spring.boot.entity.secondary") //设置实体类所在位置
.persistenceUnit("secondaryPersistenceUnit")
.build();
}
public Map<String, Object> getVerdorProperties(){
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
@Bean(name = "transactionManagerSecondary")
public PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
5.路径图
注意事项:
1.两个数据源的实体类跟repository不能在相同路径下(代码中有体现,需要单独标注出路径)
2.主数据源加@primary注解,第二数据源不用加
3.以上所有都是基于SpringBoot2.0(2.0根1.0有细微差距)