@(文章目錄) 提示:本文僅供學習交流,請勿用於非法活動! 前言 本文大概內容: 例如:隨著MongoDB的廣泛應用,電商用到MongoDB也越來越多。本文主要是在將購物車模塊切換到MongoDB框架前,如何快速將Mysql中購物車大批量訂單拷貝到MongoDB資料庫中? 一、原來代碼 如下,我們將 ...
@
目錄提示:本文僅供學習交流,請勿用於非法活動!
前言
本文大概內容:
例如:隨著MongoDB的廣泛應用,電商用到MongoDB也越來越多。本文主要是在將購物車模塊切換到MongoDB框架前,如何快速將Mysql中購物車大批量訂單拷貝到MongoDB資料庫中?
一、原來代碼
如下,我們將拷貝100萬條數據到MongoDB中。
public void copyCartToMongo() {
List<Cart> carts = cartMapper.selectAll();
if(carts.size() >0 ){
cartMongoService.saveCartList(carts);
}
}
二、改進後代碼
public void copyCartToMongoByThread() {
// 1.我們先將批量查詢及拷貝的數據分批
EntityWrapper<Cart> wrapper = SQLHelper.buildEmptyWrapper(Cart.class);
long count = cartMapper.selectCount(SQLHelper.build(Cart.class).geEntityWrapper());
int preCount = 100;
int operateCount = 0;
int num = operateCount = (int)count / preCount;
if(count % preCount == 0){
operateCount = num;
}else {
operateCount = num + 1;
}
for(int i=0;i<operateCount;i++){
logger.info("保存或更新第"+(i+1)*preCount+"條數據");
Page<Cart> page = new Page<>(i,preCount);
List<Cart> cartList = cartMapper.selectPage(page, wrapper);
// 2.通過多線程、線程池(其他替換即可)
this.copyCartToMongoThread(cartList);
}
}
上述代碼中有以下三種方式實現:
1.使用new Thread方式
代碼如下:
public void copyCartToMongoThread(List<Cart> cartList){
final CountDownLatch latch = new CountDownLatch(cartList.size());
try{
for(Cart cart:cartList){
Thread thread = new Thread(() -> {
cartMongoService.saveCart(cart);
latch.countDown();
});
thread.start();
}
latch.await();
} catch (Exception e) {
e.printStackTrace();
}
}
2.使用Runnable介面
代碼如下:
public void copyCartToMongoThread(List<Cart> cartList){
final CountDownLatch latch = new CountDownLatch(cartList.size());
try {
for (Cart cart:cartList){
new Thread(new Runnable() {
@Override
public void run() {
cartMongoService.saveCart(cart);
latch.countDown();
}
}).start();
}
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
3.使用線程池
代碼如下:
public void copyCartToMongoThreadPool(List<Cart> cartList){
final CountDownLatch latch = new CountDownLatch(cartList.size());
// 配置線程池個數
ExecutorService executorService = Executors.newFixedThreadPool(1);
try{
for(Cart cart:cartList){
executorService.submit(new Runnable() {
@Override
public void run() {
try{
cartMongoService.saveCart(cart);
// 一直阻塞當前線程,直到計數器值為0,保證併發
latch.await();
} catch (Exception e) {
e.printStackTrace();
}
}
});
latch.countDown();
}
} catch (Exception e) {
e.printStackTrace();
}
}
隨心所往,看見未來。Follow your heart,see night!
歡迎點贊、關註、留言,一起學習、交流!