SpringBoot2 多数据源、多事务管理配置
1. 首先启动事务管理:@EnableTransactionManagement
2. 添加基础配置:
server.port=8080
#master
spring.datasource.master.jdbc-url=jdbc:mysql://localhost:3306/
spring.datasource.master.username=root
spring.datasource.master.password=root
#slave
spring.datasource.slave.jdbc-url=jdbc:mysql://localhost:3306/
spring.datasource.slave.username=root
spring.datasource.slave.password=root
#jpa
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
# implicit naming strategy fully qualified name
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
3. 添加配置:
/**
* Created by xiehui1956(@)gmail.com on 2020/4/26
*/
@Configuration
public class DataSourceConfig {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Primary
@Bean(name = "masterDataSource")
@Qualifier(value = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource getDefaultDataSource() {
return DataSourceBuilder.create().build();
}
/**
* clickHouse操作模板
*
* @return
*/
@Bean(name = "slaveDataSource")
@Qualifier(value = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource getServiceClickHouseDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "masterJdbcTemplate")
public JdbcTemplate masterJdbcTemplate(@Qualifier(value = "masterDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "slaveJdbcTemplate")
public JdbcTemplate slaveJdbcTemplate(@Qualifier(value = "slaveDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
4. 添加事务配置:
/**
* Created by xiehui1956(@)gmail.com on 2020/4/26
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryMaster"
, transactionManagerRef = "transactionManagerMaster"
, basePackages = {"com.dao"})
public class DataSourceMasterManager {
@Autowired
@Qualifier("masterDataSource")
private DataSource masterDataSource;
@Primary
@Bean(name = "entityManagerFactoryMaster")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(masterDataSource)
.packages("com.entity")
.persistenceUnit("masterDataPersistenceUnit")
.build();
}
@Bean("transactionManagerMaster")
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
/**
* Created by xiehui1956(@)gmail.com on 2020/4/26
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySlave"
, transactionManagerRef = "transactionManagerSlave"
, basePackages = {"com.dto"})
public class DataSourceSlaveManager {
@Autowired
@Qualifier("slaveDataSource")
private DataSource slaveDataSource;
@Bean(name = "entityManagerFactorySlave")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(slaveDataSource)
.packages("com.deo")
.persistenceUnit("slaveDataPersistenceUnit")
.build();
}
@Bean("transactionManagerSlave")
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
5. 使用
@Resource
@Qualifier(value = "masterJdbcTemplate")
private JdbcTemplate jdbcTemplate;