parent
8a56c9a3af
commit
7babf9653e
@ -1,57 +0,0 @@
|
||||
package com.bsmlab.dfx.agent.config;
|
||||
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.apache.ibatis.datasource.pooled.PooledDataSource;
|
||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||
import org.mybatis.spring.SqlSessionTemplate;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Configuration
|
||||
@MapperScan(basePackages = "com.bsmlab.dfx.agent", sqlSessionTemplateRef = "dynamicSqlSessionTemplate")
|
||||
public class DynamicDataSourceConfig {
|
||||
|
||||
@Bean
|
||||
public DynamicRoutingDataSource dynamicRoutingDataSource() {
|
||||
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
|
||||
|
||||
// 기본 데이터소스 등록
|
||||
DataSource defaultDataSource = createDataSource("jdbc:mysql://localhost:3306/default_db", "root", "password");
|
||||
dynamicRoutingDataSource.addDataSource("default", defaultDataSource);
|
||||
|
||||
return dynamicRoutingDataSource;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public DataSourceTransactionManager transactionManager(DynamicRoutingDataSource dynamicRoutingDataSource) {
|
||||
return new DataSourceTransactionManager(dynamicRoutingDataSource);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SqlSessionFactory sqlSessionFactory(DynamicRoutingDataSource dynamicRoutingDataSource) throws Exception {
|
||||
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
|
||||
sessionFactory.setDataSource(dynamicRoutingDataSource);
|
||||
return sessionFactory.getObject();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SqlSessionTemplate dynamicSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
|
||||
return new SqlSessionTemplate(sqlSessionFactory);
|
||||
}
|
||||
|
||||
private DataSource createDataSource(String url, String username, String password) {
|
||||
// DBCP2 Connection Pool 사용
|
||||
PooledDataSource dataSource = new PooledDataSource();
|
||||
dataSource.setDriver("com.mysql.cj.jdbc.Driver");
|
||||
dataSource.setUrl(url);
|
||||
dataSource.setUsername(username);
|
||||
dataSource.setPassword(password);
|
||||
return dataSource;
|
||||
}
|
||||
}
|
||||
@ -1,28 +0,0 @@
|
||||
package com.bsmlab.dfx.agent.config;
|
||||
|
||||
import org.apache.ibatis.datasource.pooled.PooledDataSource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
@Service
|
||||
public class DynamicDataSourceService {
|
||||
|
||||
@Autowired
|
||||
private DynamicRoutingDataSource dynamicRoutingDataSource;
|
||||
|
||||
public void addNewDataSource(String dataSourceName, String driver, String url, String username, String password) {
|
||||
DataSource newDataSource = createDataSource(driver, url, username, password);
|
||||
dynamicRoutingDataSource.addDataSource(dataSourceName, newDataSource);
|
||||
System.out.println("✅ 새로운 데이터소스 추가됨: " + dataSourceName);
|
||||
}
|
||||
|
||||
private DataSource createDataSource(String driver, String url, String username, String password) {
|
||||
PooledDataSource dataSource = new PooledDataSource();
|
||||
dataSource.setDriver(driver);
|
||||
dataSource.setUrl(url);
|
||||
dataSource.setUsername(username);
|
||||
dataSource.setPassword(password);
|
||||
return dataSource;
|
||||
}
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
package com.bsmlab.dfx.agent.config;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Mapper
|
||||
public interface UserMapper {
|
||||
@Select("SELECT * FROM users")
|
||||
List<Map<String, Object>> findAll();
|
||||
}
|
||||
@ -1,26 +0,0 @@
|
||||
package com.bsmlab.dfx.agent.config;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class UserService {
|
||||
private final DynamicRoutingDataSource dynamicRoutingDataSource;
|
||||
private UserMapper userMapper;
|
||||
|
||||
public void fetchUsersFromDefault() {
|
||||
dynamicRoutingDataSource.setDataSource("default");
|
||||
System.out.println("🔹 Default DB에서 데이터 조회");
|
||||
System.out.println(userMapper.findAll());
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void fetchUsersFromNewDB() {
|
||||
dynamicRoutingDataSource.setDataSource("newDB");
|
||||
System.out.println("🔹 New DB에서 데이터 조회");
|
||||
System.out.println(userMapper.findAll());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
package com.bsmlab.dfx.agent.config.datasource;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
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.jdbc.datasource.DataSourceTransactionManager;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.sql.DataSource;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
@Service
|
||||
public class DynamicDataSourceService {
|
||||
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);
|
||||
refreshableSqlSessionFactoryBean.setDataSource(dataSource);
|
||||
this.sqlSessionFactoryMap.put(dataSourceId, refreshableSqlSessionFactoryBean.getObject());
|
||||
}
|
||||
return this.sqlSessionFactoryMap.get(dataSourceId);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
package com.bsmlab.dfx.agent.config.datasource;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@Slf4j
|
||||
public class SqlExecuteService {
|
||||
private final DynamicRoutingDataSource dynamicRoutingDataSource;
|
||||
private final DynamicDataSourceService dynamicDataSourceService;
|
||||
|
||||
public List<Map<String, Object>> select(String dataSourceId, String sqlId, Map<String, Object> parameter) {
|
||||
dynamicRoutingDataSource.setDataSource(dataSourceId);
|
||||
try {
|
||||
SqlSessionFactory sqlSessionFactory = dynamicDataSourceService.getSqlSessionFactory(dataSourceId);
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession();
|
||||
return sqlSession.selectList(sqlId, parameter);
|
||||
}
|
||||
finally {
|
||||
dynamicRoutingDataSource.clearDataSource();
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, Object> insert(String dataSourceId, String sqlId, Map<String, Object> parameter) {
|
||||
dynamicRoutingDataSource.setDataSource(dataSourceId);
|
||||
try {
|
||||
SqlSessionFactory sqlSessionFactory = dynamicDataSourceService.getSqlSessionFactory(dataSourceId);
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession();
|
||||
sqlSession.insert(sqlId, parameter);
|
||||
return parameter;
|
||||
}
|
||||
finally {
|
||||
dynamicRoutingDataSource.clearDataSource();
|
||||
}
|
||||
}
|
||||
|
||||
public int update(String dataSourceId, String sqlId, Map<String, Object> parameter) {
|
||||
dynamicRoutingDataSource.setDataSource(dataSourceId);
|
||||
try {
|
||||
SqlSessionFactory sqlSessionFactory = dynamicDataSourceService.getSqlSessionFactory(dataSourceId);
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession();
|
||||
return sqlSession.update(sqlId, parameter);
|
||||
}
|
||||
finally {
|
||||
dynamicRoutingDataSource.clearDataSource();
|
||||
}
|
||||
}
|
||||
|
||||
public int delete(String dataSourceId, String sqlId, Map<String, Object> parameter) {
|
||||
dynamicRoutingDataSource.setDataSource(dataSourceId);
|
||||
try {
|
||||
SqlSessionFactory sqlSessionFactory = dynamicDataSourceService.getSqlSessionFactory(dataSourceId);
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession();
|
||||
return sqlSession.delete(sqlId, parameter);
|
||||
}
|
||||
finally {
|
||||
dynamicRoutingDataSource.clearDataSource();
|
||||
}
|
||||
}
|
||||
|
||||
public void execute(String dataSourceId, String sqlId, Map<String, Object> parameter) {
|
||||
dynamicRoutingDataSource.setDataSource(dataSourceId);
|
||||
try {
|
||||
SqlSessionFactory sqlSessionFactory = dynamicDataSourceService.getSqlSessionFactory(dataSourceId);
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession();
|
||||
sqlSession.selectOne(sqlId, parameter);
|
||||
}
|
||||
finally {
|
||||
dynamicRoutingDataSource.clearDataSource();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue