1. 程式人生 > >批量更新程式碼整理(程式碼庫)從陣列中批量取資料的方法

批量更新程式碼整理(程式碼庫)從陣列中批量取資料的方法

查詢出所有的資料,分批插入。從原來的所有的list 資料裡面,每次拿出X 條資料,再批量更新

public void insertStudent() {
    List<Student> list = studentDao.listAllStudentForStat();
    int batchNum = 2000; //批量更新的條數,每X條更新一次
    for (int i = 0; i < list.size(); i += batchNum) {
        List<Student> ansList = new ArrayList<>(batchNum);
        
int max = i + batchNum < list.size() ? i + batchNum : list.size(); ansList.addAll(list.subList(i, max)); try { if (!ansList.isEmpty()) { //批量插入 studentDao.insertOrUpdateStudentList(ansList); logger.info("定時更新student表時,更新了 {} 資料,最後的指標為 {}", ansList.size(), max); } }
catch (Exception e) { logger.error("更新student表異常,異常資訊為:{}", e.getMessage(), e); } } }

 

升級版

查詢出所有的資料,分批插入,並且插入的每條資料需要再通過其他的表來賦值特定的欄位。
如果在for迴圈裡,每次都查詢表,也很耗效能,比較好的辦法,一次查詢,放到map裡,從記憶體裡進行查詢

public void insertStudent() {
    List<Student> list = studentDao.listAllStudentForStat();
    
int batchNum = 2000; //批量更新的條數,每X條更新一次 for (int i = 0; i < list.size(); i += batchNum) { List<Student> ansList = new ArrayList<>(batchNum); int max = i + batchNum < list.size() ? i + batchNum : list.size(); ansList.addAll(list.subList(i, max)); try { //批量查詢 List<UserLoginDateVo> userLastLoginDateList = userDao.listLastLoginDateByStudentList(studentList); //將查詢出的實體放到map物件裡去 Map<Long, Date> userLastLoginDateMap = new HashMap<>(); if (userLastLoginDateList != null && !userLastLoginDateList.isEmpty()) { for (UserLoginDateVo item : userLastLoginDateList) { userLastLoginDateMap.put(item.getUid(), item.getLoginDate()); } } //從map物件中取值,賦給實體物件 for (Student student : ansList) { student.setLoginTime(Optional.ofNullable(userLastLoginDateMap.get(student.getUid())).orElse(DateUtil.getDefaultDate())); } if (!ansList.isEmpty()) { //批量插入 studentDao.insertOrUpdateStudentList(ansList); logger.info("定時更新student表時,更新了 {} 資料,最後的指標為 {}", ansList.size(), max); } } catch (Exception e) { logger.error("更新student表異常,異常資訊為:{}", e.getMessage(), e); } } }

 

 原創文章,歡迎轉載,轉載請註明出處!