问题描述:
springcloud框架,有两个数据源,执行批量导入,因为数据量比较大,就在数据分片后创建线程,在新线程里进行批量插入操作,目的插入到非默认数据源中,然而数据灌入到默认数据源去了。
解决问题的理论
很简单,就是新线程创建的时候,数据源就切换回默认数据源去了,所以在每个线程里都要重新指向目的数据源【form同事大佬的教诲
但是我很好奇这个机制的设定要去哪里看,等待路人大佬的指路,如果很难找的话就算了
参考代码
@Autowired
private XXXServiceClient xxxService;
public void test(List<XXX> list) {
int count = 300;
int threadSize = list.size() % count == 0 ? list.size() / count : list.size() / count + 1;
for (int i = 0; i < threadSize; i++) {
int startIndex = (i * count);
int endIndex = (i + 1) * count >= list.size() ? list.size() : (i + 1) * count;
List<XXX> finalList = list.subList(startIndex, endIndex);
// 新线程
executor.execute(new Runnable() {
@Override
public void run() {
// 调用批量插入
xxxService.insertBatch(finalList);
}
});
}
}
// 重新指向数据源
@DataSource(name = 目标数据源)
public void insertBatch(List<XXX> list) {
xxxMapper.insertByBatch(list);
}
大概就是以上这些,附简约思维:
method(){
for(...){
// 新线程
method2();
}
}
// 切换数据源
method2(){
}
然后下面是看了之后有启发的参考博文,有关于数据源切换失败的另一种原因以及解决方法,有关代理的一些参考