package com.thhy.general.config.mysql;
|
|
import com.thhy.general.common.enums.DataSources;
|
import com.zaxxer.hikari.HikariDataSource;
|
import org.apache.ibatis.logging.slf4j.Slf4jImpl;
|
import org.apache.ibatis.logging.stdout.StdOutImpl;
|
import org.apache.ibatis.plugin.Interceptor;
|
import org.apache.ibatis.session.SqlSessionFactory;
|
import org.apache.ibatis.transaction.TransactionFactory;
|
import org.mybatis.spring.SqlSessionFactoryBean;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.jdbc.DataSourceBuilder;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Primary;
|
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
import org.springframework.transaction.TransactionManager;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
import javax.sql.DataSource;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
|
@Configuration
|
@ConditionalOnProperty(prefix = "spring.datasource.hikari",value = "minIdle",havingValue = "10")
|
@EnableTransactionManagement
|
public class MysqlConfig {
|
|
@Autowired
|
private MysqlPrimary mysqlPrimary;
|
|
@Autowired
|
private MysqlSecondary mysqlSecondary;
|
|
@Autowired
|
private HikariConfig hikariConfig;
|
|
@Autowired
|
private SwtichInterceptor swtichInterceptor;
|
|
@Bean
|
@Primary
|
public DataSource dataSourcePrimary() {
|
HikariDataSource hikariDataSource = new HikariDataSource();
|
hikariDataSource.setMaxLifetime(hikariConfig.getMaxLifeTime());
|
hikariDataSource.setMaximumPoolSize(hikariConfig.getMaxPoolSize());
|
hikariDataSource.setMinimumIdle(hikariConfig.getMinIdle());
|
hikariDataSource.setIdleTimeout(hikariConfig.getIdleTimeOut());
|
DataSource dataSource = DataSourceBuilder.create().url(mysqlPrimary.getUrl())
|
.driverClassName(mysqlPrimary.getDriverClassName())
|
.username(mysqlPrimary.getUsername())
|
.password(mysqlPrimary.getPassword()).build();
|
hikariDataSource.setDataSource(dataSource);
|
return hikariDataSource;
|
}
|
|
@Bean
|
public DataSource dataSourceSecondary() {
|
HikariDataSource hikariDataSource = new HikariDataSource();
|
hikariDataSource.setMaxLifetime(hikariConfig.getMaxLifeTime());
|
hikariDataSource.setMaximumPoolSize(hikariConfig.getMaxPoolSize());
|
hikariDataSource.setMinimumIdle(hikariConfig.getMinIdle());
|
hikariDataSource.setIdleTimeout(hikariConfig.getIdleTimeOut());
|
DataSource dataSource = DataSourceBuilder.create().url(mysqlSecondary.getUrl())
|
.driverClassName(mysqlSecondary.getDriverClassName())
|
.username(mysqlSecondary.getUsername())
|
.password(mysqlSecondary.getPassword()).build();
|
hikariDataSource.setDataSource(dataSource);
|
return hikariDataSource;
|
}
|
|
|
|
@Bean
|
public DynamicDataSource proxyDataSource(@Qualifier("dataSourcePrimary") DataSource dataSourcePrimary,
|
@Qualifier("dataSourceSecondary") DataSource dataSourceSecondary) {
|
Map<Object, Object> mappedDataSource = new HashMap<>();
|
mappedDataSource.put(DataSources.MASTER.name(), dataSourcePrimary);
|
mappedDataSource.put(DataSources.SLAVE.name(), dataSourceSecondary);
|
DynamicDataSource proxy = new DynamicDataSource();
|
proxy.setDefaultTargetDataSource(dataSourcePrimary);
|
proxy.setTargetDataSources(mappedDataSource);
|
proxy.afterPropertiesSet();
|
return proxy;
|
}
|
|
/*@Bean
|
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
|
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
|
sqlSessionFactoryBean.setDataSource(dataSource);
|
sqlSessionFactoryBean.setTypeAliasesPackage("com.thhy.*.modules.*.*.mapper");
|
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/*.xml"));
|
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
|
|
return sqlSessionFactory;
|
}*/
|
|
@Bean
|
public SqlSessionFactory SqlSessionFactory(DynamicDataSource dynamicDataSource)
|
throws Exception {
|
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
|
sessionFactory.setPlugins(new Interceptor[]{swtichInterceptor});
|
sessionFactory.setDataSource(dynamicDataSource);
|
//sessionFactory.setTransactionFactory();
|
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
|
configuration.setLogImpl(StdOutImpl.class);
|
configuration.setMapUnderscoreToCamelCase(true);
|
sessionFactory.setConfiguration(configuration);
|
|
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
|
.getResources("classpath*:mapping/*.xml"));
|
return sessionFactory.getObject();
|
}
|
|
@Bean
|
public TransactionManager TransactionManager(DynamicDataSource dynamicDataSource) {
|
return new DataSourceTransactionManager(dynamicDataSource);
|
}
|
|
/*@Bean(name = "priSqlSessionFactory")
|
@Primary
|
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dataSourcePrimary") DataSource dataSourcePrimary)
|
throws Exception {
|
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
|
sessionFactory.setPlugins(new Interceptor[]{swtichInterceptor});
|
sessionFactory.setDataSource(dataSourcePrimary);
|
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
|
.getResources("classpath*:mapping/*.xml"));
|
return sessionFactory.getObject();
|
}
|
|
|
@Bean(name = "secSqlSessionFactory")
|
public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("dataSourceSecondary") DataSource dataSourceSecondary)
|
throws Exception {
|
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
|
sessionFactory.setPlugins(new Interceptor[]{swtichInterceptor});
|
sessionFactory.setDataSource(dataSourceSecondary);
|
|
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
|
.getResources("classpath*:mapping/*.xml"));
|
return sessionFactory.getObject();
|
}*/
|
|
|
}
|