插入大量資料至MongoDB資料庫的速度問題分析
阿新 • • 發佈:2019-02-07
需求背景:某定時任務產生千條或更多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() );
}
}
}