81,122
社区成员




package com.zhaojufei.dataclean.common.dao;
import com.alibaba.druid.pool.DruidDataSource;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.zhaojufei.dataclean.common.dao.entity.DataSourceConfig;
import com.zhaojufei.dataclean.common.dao.entity.MybatiesConfig;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
public class DataSourceHolder {
/**
* 数据源Map
*/
public static Map<String, SqlSessionTemplate> sqlSessionTemplateMap = Maps.newHashMap();
/**
* 获取key对应的数据源操作客户端SqlSessionTemplate
*/
public static SqlSessionTemplate getSqlSessionTemplate(String key) {
return sqlSessionTemplateMap.get(key);
}
/**
* 创建数据源
*/
@PostConstruct
public void init() {
// 这个读取数据源的配置,正式代码需改为读取数据表的数据
List<DataSourceConfig> dbList = Lists.newArrayList();
DataSourceConfig db1 = DataSourceConfig.builder().name("datasource1").driverClassName("com.mysql.jdbc.Driver")
.url("jdbc:mysql://127.0.0.1:3306/dataclean1?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false")
.username("root").password("zhaojufei123").build();
DataSourceConfig db2 = DataSourceConfig.builder().name("datasource2").driverClassName("com.mysql.jdbc.Driver")
.url("jdbc:mysql://127.0.0.1:3306/dataclean2?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false")
.username("root").password("zhaojufei123").build();
dbList.add(db1);
dbList.add(db2);
log.info("MybatiesConfig配置信息:" + MybatiesConfig.mapperLocations + "," + MybatiesConfig.configLocation);
dbList.forEach(config -> {
try {
// 1、首先创建数据源
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(config.getDriverClassName());
ds.setUrl(config.getUrl());
ds.setUsername(config.getUsername());
ds.setPassword(config.getPassword());
// 2、创建sqlSessionFactory
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(ds);
// sqlSessionFactory.setConfigLocation(new ClassPathResource(MybatiesConfig.configLocation));
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactory.setMapperLocations(resolver.getResources(MybatiesConfig.mapperLocations));
// 3、创建sqlSessionTemplate
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory.getObject());
sqlSessionTemplateMap.put(config.getName(), sqlSessionTemplate);
// 4、控制事务
DataSourceTransactionManager manager = new DataSourceTransactionManager(ds);// 卡在这里了,不知道怎么写
} catch (Exception e) {
// 创建失败,继续创建下一个
log.error("创建数据源异常,msg = {}, e={}", e.getMessage(), e);
}
});
}
}
package com.zhaojufei.dataclean.clean.dao.impl;
import org.springframework.stereotype.Component;
import com.zhaojufei.dataclean.clean.dao.DataCleanDao;
import com.zhaojufei.dataclean.common.dao.DataSourceHolder;
/**
* 由于同一套代码(dao)需要通过不同的数据源操作数据,操作数据时需要选择数据源
* 所以这个dao做成了普通组件
*/
@Component
public class DataCleanDaoImpl implements DataCleanDao {
/**
* 通过指定数据源执行数据清理,比较建议显示传递参数
*
* @param datasource
*/
@Override
public void clean(String datasource) {
DataSourceHolder.getSqlSessionTemplate(datasource)
.delete("com.zhaojufei.dataclean.clean.dao.DataCleanDao.clean");
}
/**
* 通过指定数据源执行数据清理,比较建议显示传递参数
*
* @param datasource
*/
@Override
public void clean2(String datasource) {
DataSourceHolder.getSqlSessionTemplate(datasource)
.delete("com.zhaojufei.dataclean.clean.dao.DataCleanDao.clean2");
}
}
@Override
@Transactional
public void cleanData() {
dataCleanDao.clean("datasource1");
int i = 1 / 0;
dataCleanDao.clean2("datasource1");
}