插入大量資料至MongoDB資料庫的速度問題分析

來源:互聯網
上載者:User
                       插入大量資料至MongoDB資料庫的速度問題分析

需求背景:某定時任務產生千條或更多JSON資料,本次資料還未完全寫入資料庫中,下一次定時任務的資料已經產生,由此而產生的資料擁堵怎麼解決。


最初使用SpringBoot對MongoDB資料庫做資料插入操作時,使用的是MongoTemplate中的save方法完成資料存放區操作。


具體代碼實現如下:

JSONArray為我從定時任務中擷取到的資料。
for (int i = 0;i < jsonArray.size();i++){
    mongoTemplate.save(jsonArray.get(i),"儲存的庫名");
}


此種方式存資料太慢,因為是遍曆後一個一個儲存,效率太低。

可以採用mongoCollection.insertMany()方法,此方法可以批量插入資料,效率很高


具體實現代碼如下:

//首先,建立一個MongoDB串連資料庫的工具類。
//此類使用的是無密碼串連資料庫的方法,如果你的資料庫有密碼,請參照文章末尾的代碼。那個代碼是使用使用者名稱、密碼串連資料庫的方法,代碼摘自菜鳥教程,親測有效。
public class MongoDBJDBC {
   static  String MONGO_IP = "資料庫IP地址";
   static  Integer MONGO_PORT = 資料庫連接埠號碼,預設為27017;
   public static MongoCollection getMongoDatabase(String databaseName,String collectionName){
       MongoCollection mongoCollection = null;
       try {
           MongoClient mongoClient = new MongoClient(MONGO_IP,MONGO_PORT);
           MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
           mongoCollection = mongoDatabase.getCollection(collectionName);
       }catch (Exception e){
           System.out.println(e.getClass().getName()+":"+e.getMessage());
       }
       return mongoCollection;
   }
}

擷取到MongoCollection對象之後,使用其insertMany方法,插入一個集合。
public void insertData(){
//先使用remove方法,對某資料做刪除,再做插入操作,以此實現批量資料的更新功能。
       Query query = new Query(Criteria.where("busi_type").       
                   is(TransformTime.getStringDate()));
       mongoTemplate.remove(query,"資料庫中的集合名");    

       List<Document> list = //擷取到需要插入到資料庫中的方法。

//使用工具類,擷取到指定資料庫的MongoCollection對象
       MongoCollection mongoCollection = MongoDBJDBC.getMongoDatabase("資料庫名","資料庫集合名");
       mongoCollection.insertMany(list);
   }


MongoDB資料庫有使用者名稱、密碼時,串連資料庫的方法樣本

import java.util.ArrayList;  
import java.util.List;  
import com.mongodb.MongoClient;  
import com.mongodb.MongoCredential;  
import com.mongodb.ServerAddress;  
import com.mongodb.client.MongoDatabase;  

public class MongoDBJDBC {  
   public static void main(String[] args){  
       try {  
           //串連到MongoDB服務 如果是遠端連線可以替換“localhost”為伺服器所在IP地址  
           //ServerAddress()兩個參數分別為 伺服器位址 和 連接埠  
           ServerAddress serverAddress = new ServerAddress("localhost",27017);  
           List<ServerAddress> addrs = new ArrayList<ServerAddress>();  
           addrs.add(serverAddress);  

           //MongoCredential.createScramSha1Credential()三個參數分別為 使用者名稱 資料庫名稱 密碼  
           MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());  
           List<MongoCredential> credentials = new ArrayList<MongoCredential>();  
           credentials.add(credential);  

           //通過串連認證擷取MongoDB串連  
           MongoClient mongoClient = new MongoClient(addrs,credentials);  

           //串連到資料庫  
           MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");  
           System.out.println("Connect to database successfully");  
       } catch (Exception e) {  
           System.err.println( e.getClass().getName() + ": " + e.getMessage() );  
       }  
   }  
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.