/**
* 读取本地文件,解析文件,然后数据入库
* 1 读取本地文件 300MB放到一个集合里
* 2 拆分这个集合 每个集合按照maxNum = 10000长度拆分放到一个大的集合里
* 根据大集合长度动态创建线程池 ExecutorService executor = Executors.newFixedThreadPool(lists.size());
* 然后多线程执行入库操作
* 70w数据大概60分钟时间完成
*/
@GetMapping("/read")
public void readFile() {
String path = "C:\\Users\\YangTG\\Desktop\\eventInst2.txt";
List<List<String>> lists = new ArrayList<>();
int maxNum = 10000;
try {
List<String> list = Files.lines(Paths.get(path)).collect(Collectors.toList());
//System.out.println("读取的文件总行数" + list.size());
int count = countStep(list.size(), maxNum);
//System.out.println("集合切割的长度" + count);
Stream.iterate(0, f -> f + 1).limit(count).parallel().forEach(a -> {
// skip跳过的行数 limit最大行数
lists.add(list.stream().skip(a * maxNum).limit(maxNum).collect(Collectors.toList()));
});
System.out.println("切割后的集合长度:" + lists.size());
ExecutorService executor = Executors.newFixedThreadPool(lists.size());
try {
lists.stream().forEach(a -> {
executor.execute(() -> {
a.stream().forEach(this::accessParam);
});
log.info("当前线程名称{}", Thread.currentThread().getName());
});
} catch (Exception e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 集合拆分
*
* @param listSize 集合长度
* @param size 每个集合长度
* @return
*/
public int countStep(int listSize, int size) {
int count = listSize / size;
return listSize % size == 0 ? count : count + 1;
}
/**
* 插入数据
*
* @param param
*/
@Transactional
public void accessParam(String param) {
String nowDate = TimeUtil.foramt(TimeUtil.YYYYMMMDDSS, new Date());
JSONObject jsonObject = JSONObject.parseObject(param).getJSONObject("contractRoot").getJSONObject("svcCont")
.getJSONObject("requestObject");
String evtSerialNum = "EVT" + jsonObject.getString("eventInstId");
String sql = "insert into EVENT_INST(EVT_INST_ID,EVT_SERIAL_NUM,EVENT_ID,EVT_COLLECT_TIME,EVT_CONTENT,STATUS_CD," +
"CREATE_STAFF,UPDATATIME_STAFF,CREATE_DATATIME,STATUS_DATATIME,UPDATATIME_DATATIME,REMARK) values(" +
"?,?,?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.update(sql, jsonObject.getString("eventInstId"), evtSerialNum, jsonObject.getString("eventId"), nowDate,
param, "1000", "1", "1", nowDate, nowDate, nowDate, "从文件中读取");
}