1.场景
例如有一张成语字典表
,数据在13000
条左右,需要将数据经过处理存到另一个存储中(可以是数据库),如何才能加快处理速度?
![](/mb/images/how-faster.png)
2.推荐工具
ETL
工具kettle
3.解决方案
3.1.多线程互斥加快处理速度
代码地址:https://gitee.com/mgang/scene-handle/tree/master/handle-fastjob
1). 创建线程池执行对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| @Component
public class MainExecutor {
private Logger log = LoggerFactory.getLogger(this.getClass());
private ThreadPoolExecutor executor;
private BlockingQueue blockingQueue;
private int initNum = 3;
private int maxNum = 10;
private int queueSize = 100;
private int keepAliveTime = 60;//单位秒
@PostConstruct
protected void init(){
blockingQueue = new ArrayBlockingQueue<>(queueSize);
executor = new ThreadPoolExecutor(initNum, maxNum, keepAliveTime,
TimeUnit.SECONDS, blockingQueue,
new ThreadPoolExecutor.CallerRunsPolicy());
}
/**
* 添加任务
* @param runnable
*/
public void addTask(Runnable runnable){
log.info("线程池ThreadPoolExecutor-ArrayBlockingQueue队列当前大小:"+blockingQueue.size());
executor.execute(runnable);
}
}
|
2). 定义好业务处理线程
1
2
3
4
5
6
7
8
9
10
| public class WorkThread implements Runnable {
private IYesoulChenYuService yesoulChenYuService =
(IYesoulChenYuService) SpringUtil.getBean("yesoulChenYuServiceImpl");
@Override
public void run() {
yesoulChenYuService.moveData();
}
}
|
3). 实现具体的业务逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| @Service
public class YesoulChenYuServiceImpl extends ServiceImpl<YesoulChenYuMapper, YesoulChenYu> implements IYesoulChenYuService {
@Autowired
@Qualifier("yesoulChenYu2ServiceImpl")
private IYesoulChenYu2Service yesoulChenYu2Service;
@Autowired
private YesoulChenYuMapper yesoulChenYuMapper;
@Override
public void moveData() {
List<YesoulChenYu> list = null;
synchronized (this) {
//1.先查询数据 线程锁
list = yesoulChenYuMapper.selectList();
System.out.println(JSONObject.toJSONString(list));
for (YesoulChenYu yesoulChenYu : list) {
//1.1.将状态修改为正在同步中 1
YesoulChenYu update = new YesoulChenYu();
update.setId(yesoulChenYu.getId());
update.setFlag("1");
this.updateById(update);
}
}
for (YesoulChenYu yesoulChenYu : list) {
//2.保存到目标库
TargetYesoulChenYu t = new TargetYesoulChenYu();
BeanUtils.copyProperties(yesoulChenYu, t);
yesoulChenYu2Service.saveData(t);
//3.修改同步标识
YesoulChenYu update = new YesoulChenYu();
update.setId(yesoulChenYu.getId());
update.setFlag("2");
this.updateById(update);
}
}
}
|