配置数据源:
–dataSource-- entitymanagerfactory–PlatformTransactionManager
–springboot jpa配置
OrderRepository和VerifyRepository在同一个包下面,扫描的时候会把所有的orderRepository,verifyRepository类配置两个,扫描两次注入容器中的名称和类型又是一样的,所以会有冲突,只会有一个生效
并不知道PrimaryConfiguration和BackupConfiguration谁先配置
repository 扫描的时候并不确定那个先扫描,查看源代码,设断点看扫描顺序
解决办法:
将orderRepository,verifyRepository分开放在两个包里。
- @primary
- Mysql主从复制,alibaba/otter
查看源码的步骤:
文档 – 猜想–暴力搜索Ctrl+H
application.yml
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT
datasource:
primary:
url: jdbc:mysql:///seller?useUnicode=true&characterEncoding=utf-8
username: root
password: 915099
driverClassName: com.mysql.jdbc.Driver
backup:
url: jdbc:mysql:///seller-backup?useUnicode=true&characterEncoding=utf-8
username: root
password: 915099
driverClassName: com.mysql.jdbc.Driver
jpa:
database: mysql
show-sql: true
DataAccessConfiguration
package com.imooc.seller.configuration;
import com.imooc.entity.Order;
import com.imooc.seller.repositories.OrderRepository;
import com.imooc.seller.repositories.VerifyRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 数据库相关操作配置
*/
@Configuration
public class DataAccessConfiguration {
@Autowired
private JpaProperties properties;
//配置数据源 dataSource-- entitymanagerfactory--PlatformTransactionManager--springboot jpa配置
//主库数据源
@Bean
@Primary
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource(){
return DataSourceBuilder.create().build();
}
//备份库数据源
@Bean
@ConfigurationProperties("spring.datasource.backup")
public DataSource backupDataSource(){
return DataSourceBuilder.create().build();
}
//主库LocalContainerEntityManagerFactoryBean
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource){
return builder
.dataSource(dataSource)
.packages(Order.class)
.properties(getVendorProperties(dataSource))
.persistenceUnit("primary")
.build();
}
protected Map<String,Object> getVendorProperties(DataSource dataSource){
Map<String, Object> vendorProperties = new LinkedHashMap<>();
vendorProperties.putAll(properties.getHibernateProperties((HibernateSettings) dataSource));
return vendorProperties;
}
//备库LocalContainerEntityManagerFactoryBean
@Bean
public LocalContainerEntityManagerFactoryBean backupEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("backupDataSource") DataSource dataSource){
return builder.dataSource(dataSource)
.packages(Order.class)
.properties(getVendorProperties(dataSource))
.persistenceUnit("backup")
.build();
}
//主库PlatformTransactionManager
@Bean
@Primary
public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory){
JpaTransactionManager transactionManager = new JpaTransactionManager(primaryEntityManagerFactory.getObject());
return transactionManager;
}
//备库PlatformTransactionManager
@Bean
public PlatformTransactionManager backupTransactionManager(@Qualifier("backupEntityManagerFactory") LocalContainerEntityManagerFactoryBean backupEntityManagerFactory){
JpaTransactionManager transactionManager = new JpaTransactionManager(backupEntityManagerFactory.getObject());
return transactionManager;
}
//OrderRepository和VerifyRepository在同一个包下面,扫描的时候会把所有的orderRepository,verifyRepository类配置两个,扫描两次注入容器中的名称和类型又是一样的,所以会有冲突,只会有一个生效
//并不知道PrimaryConfiguration和BackupConfiguration谁先配置
//repository 扫描的时候并不确定那个先扫描,查看源代码,设断点看扫描顺序
@EnableJpaRepositories(basePackageClasses = OrderRepository.class, entityManagerFactoryRef = "primaryEntityManager", transactionManagerRef = "primaryTransactionManager")
public class PrimaryConfiguration{
}
@EnableJpaRepositories(basePackageClasses = VerifyRepository.class, entityManagerFactoryRef = "backupEntityManagerFactory", transactionManagerRef = "backupTransactionManager")
public class BackupConfiguration{
}
}