1. 程式人生 > >java批量執行之分批處理

java批量執行之分批處理

相關:

在處理一些與資料庫相關的操作的時候,通常把一些操作合併能夠起到優化的效果,並且數量越大,批量執行的效率比一條一條執行的效率要快的多。

批量插入比單次插入快

比如有十條資料單條執行需要操作十次資料庫,批量的話執行一次資料庫的操作就可以。

對應的sql語句:

單次:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....);

INSERT INTO table_name (列1, 列2,...) VALUES (值3, 值4,....);

批量:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....),(值3, 值4,....);

大家可以用sql直接去資料庫執行做一下對比,在資料庫越大的時候,他們的速度對比越明顯。

我原來做過sql資料匯入,同樣的資料不同的sql,單次插入的執行了800s,分批的50s內完成。這只是一個大概的印象,大家可以自己做嘗試。

批量插入的缺陷

優點是可以一次性插入很多條資料,但是缺點也有,這個很多條資料是有限制的,不能無限大,資料庫太多的話資料庫直接報錯,匯入執行失敗,我記得提示的是(這條sql執行資料大於2M,無法執行),大概這樣的提示。

所以為了效率,也為了保證程式的正常執行,就需要分批的批量插入。

比如一次要插入8000條資料,資料庫受不了,那就一次插入500條。

分批程式碼

這個程式碼是某個部落格找的,原部落格找不到了,也不貼了。不過分批的方法有很多,這只是一種。

  //分批處理
                if (CollectionUtils.isNotEmpty(allList)) {
                    int pointsDataLimit = 500;//定義分批大小
                    List<User> newList = new ArrayList<User>();
                    for (int i = 0; i < allList.size(); i++) {//分批次處理
                        newList.add(allList.get(i));
                        if (pointsDataLimit == newList.size() || i == allList.size() - 1) {
                            userDao.insertAllBy(newList);//批量插入
                            newList.clear();
                        }
                    }
                }

總結:優化既要保證效率,更要注重正確性。