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