|
|
|
|
@ -1,13 +1,19 @@
|
|
|
|
|
package com.bsmlab.dfx.agent.config.datasource;
|
|
|
|
|
|
|
|
|
|
import com.bsmlab.dfx.agent.config.Settings;
|
|
|
|
|
import jakarta.annotation.PostConstruct;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.dbcp2.BasicDataSource;
|
|
|
|
|
import org.apache.ibatis.datasource.pooled.PooledDataSource;
|
|
|
|
|
import org.apache.ibatis.session.SqlSessionFactory;
|
|
|
|
|
import org.mybatis.spring.SqlSessionFactoryBean;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.context.annotation.DependsOn;
|
|
|
|
|
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.TransactionManager;
|
|
|
|
|
|
|
|
|
|
import javax.sql.DataSource;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
@ -15,18 +21,60 @@ import java.util.Map;
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@Slf4j
|
|
|
|
|
@Service
|
|
|
|
|
@DependsOn({"settings", "dynamicRoutingDataSource"})
|
|
|
|
|
public class DynamicDataSourceService {
|
|
|
|
|
private final Settings settings;
|
|
|
|
|
private final DynamicRoutingDataSource dynamicRoutingDataSource;
|
|
|
|
|
private final RefreshableSqlSessionFactoryBean refreshableSqlSessionFactoryBean;
|
|
|
|
|
private final Map<String, SqlSessionFactory> sqlSessionFactoryMap = new HashMap<>();
|
|
|
|
|
private final Map<String, DataSourceTransactionManager> transactionManagerMap = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
public SqlSessionFactory getSqlSessionFactory(String dataSourceId) {
|
|
|
|
|
if(!this.sqlSessionFactoryMap.containsKey(dataSourceId)) {
|
|
|
|
|
DataSource dataSource = this.dynamicRoutingDataSource.getDataSourceMap().get(dataSourceId);
|
|
|
|
|
return this.sqlSessionFactoryMap.get(dataSourceId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public TransactionManager getTransactionManager(String dataSourceId) {
|
|
|
|
|
return this.transactionManagerMap.get(dataSourceId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostConstruct
|
|
|
|
|
public void init() {
|
|
|
|
|
Map<String, DataSourceDto> dataSourceDtoMap = settings.getDataSourceDtoMap();
|
|
|
|
|
for(String dataSourceId : dataSourceDtoMap.keySet()) {
|
|
|
|
|
DataSourceDto dataSourceDto = dataSourceDtoMap.get(dataSourceId);
|
|
|
|
|
BasicDataSource dataSource = new BasicDataSource();
|
|
|
|
|
dataSource.setDriverClassName(dataSourceDto.getDriverClassName());
|
|
|
|
|
dataSource.setUrl(dataSourceDto.getUrl());
|
|
|
|
|
dataSource.setUsername(dataSourceDto.getUsername());
|
|
|
|
|
dataSource.setPassword(dataSourceDto.getPassword());
|
|
|
|
|
if(oracle.jdbc.driver.OracleDriver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
|
|
|
|
|
dataSource.setValidationQuery("SELECT 1 FROM DUAL");
|
|
|
|
|
}
|
|
|
|
|
else if(org.postgresql.Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
|
|
|
|
|
dataSource.setValidationQuery("SELECT 1");
|
|
|
|
|
}
|
|
|
|
|
else if(com.mysql.jdbc.Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
|
|
|
|
|
dataSource.setValidationQuery("SELECT 1");
|
|
|
|
|
}
|
|
|
|
|
else if(org.mariadb.jdbc.Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
|
|
|
|
|
dataSource.setValidationQuery("SELECT 1");
|
|
|
|
|
}
|
|
|
|
|
else if(com.ibm.db2.jcc.DB2Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
|
|
|
|
|
dataSource.setValidationQuery("SELECT 1 FROM SYSIBM.SYSDUMMY1");
|
|
|
|
|
}
|
|
|
|
|
dataSource.setTestOnBorrow(false);
|
|
|
|
|
dataSource.setTestOnReturn(false);
|
|
|
|
|
dataSource.setTestOnCreate(true);
|
|
|
|
|
dataSource.setTestWhileIdle(true);
|
|
|
|
|
dataSource.setInitialSize(3);
|
|
|
|
|
dataSource.setMinIdle(3);
|
|
|
|
|
dataSource.setMaxIdle(30);
|
|
|
|
|
dataSource.setMaxTotal(30);
|
|
|
|
|
dynamicRoutingDataSource.addDataSource(dataSourceId, dataSource);
|
|
|
|
|
refreshableSqlSessionFactoryBean.setDataSource(dataSource);
|
|
|
|
|
this.sqlSessionFactoryMap.put(dataSourceId, refreshableSqlSessionFactoryBean.getObject());
|
|
|
|
|
sqlSessionFactoryMap.put(dataSourceId, refreshableSqlSessionFactoryBean.getObject());
|
|
|
|
|
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
|
|
|
|
|
transactionManagerMap.put(dataSourceId, transactionManager);
|
|
|
|
|
}
|
|
|
|
|
return this.sqlSessionFactoryMap.get(dataSourceId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|