1. 程式人生 > >插入大量資料至MongoDB資料庫的速度問題分析

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

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

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

具體程式碼實現如下:

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

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

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

具體實現程式碼如下:

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

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

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

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

MongoDB資料庫有使用者名稱、密碼時,連線資料庫的方法示例

importjava.util.ArrayList;  
importjava.util.List;  
importcom.mongodb.MongoClient;  
importcom.mongodb.MongoCredential;  
importcom.mongodb.ServerAddress;  
importcom.mongodb.client.MongoDatabase;  

publicclassMongoDBJDBC{ 
   publicstaticvoidmain(String[] args){  
       try{  
           //連線到MongoDB服務 如果是遠端連線可以替換“localhost”為伺服器所在IP地址  
           //ServerAddress()兩個引數分別為 伺服器地址 和 埠  
           ServerAddress serverAddress =newServerAddress("localhost",27017);  
           List<ServerAddress> addrs =newArrayList<ServerAddress>();  
           addrs.add(serverAddress);  

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

           //通過連線認證獲取MongoDB連線  
           MongoClient mongoClient =newMongoClient(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() );  
       }  
   }  
}