1. 程式人生 > >優化JAVA查詢Mongodb數量過大,查詢熟讀慢的方法

優化JAVA查詢Mongodb數量過大,查詢熟讀慢的方法

前言:2018年的時候優化了一個專案,該專案從MOngodb中獲取資料的時候一次去十萬百萬千萬的資料過慢,往往每次都要二十秒,三十秒,今天提出了一個程式碼優化的方案

專案查從mongodb中獲取資料:程式碼A

Query query = new Query(); 
queryAfter.addCriteria(Criteria.where("id").in(idList));
queryAfter.addCriteria(Criteria.where("time").gte(startTime).lte(endTime));
List<TestEntity> lists = mongoTemplate.find(queryBefore,TestEntity.class);

 優化程式碼示例:程式碼B

DBObject query1 = new BasicDBObject(); //setup the query criteria 設定查詢條件 
 query1.put("id", new BasicDBObject("$in", idList));
 query1.put("time", (new BasicDBObject("$gte", startTime)).append("$lte", endTime)); 
 DBCursor dbCursor =mongoTemplate.getCollection("testEntity").find(query1); 
List<TestEntity> list=new ArrayList<>();
while (dbCursor.hasNext()){
DBObject object=dbCursor.next();
TestEntity te=new TestEntity();
te.setId(object.get("_id").toString());
te.setTime((Date) object.get("time"));
list.add(te);
}

testEntity集合有25萬條文件,查詢出4萬條文件轉換成TestEntity實體類集合,程式碼A直接轉換成實體要80秒 ,程式碼B的查詢只要不到一秒鐘!


 

 

擴充套件:

理解Java物件DBCursor

Java物件DBCursor表示MongoDB伺服器中的一組文件.使用查詢操作查詢集合時,通常返回一個DBCursor物件,而不是向Java應用程式返回全部文件物件.

這樣 能夠在Java中受控的方式訪問文件.

DBCursor物件以分批的方式從伺服器取回文件,並使用一個索引來迭代文件.

在迭代期間,當索引達到前那批文件末尾時,將從伺服器取回下批文件.


DBCursor例項提供的方法

方法

描述  
BatchSize(size) 指定每當讀取到當前已下載的最後一個文件時,遊標都將再返回多少個文件
Close() 關閉遊標並釋放它佔用的伺服器資源
Copy() 返回遊標的拷貝
Count() 返回遊標表示的文件數
hasNext() 如果遊標中還有其他可供迭代的物件,就返回true
Iterator() 為遊標建立一個迭代器物件
Limit(size) 指定遊標可最多表示多少個文件
next() 為遊標中中的下一個文件作為BDObject()返回,並將索引加一
Size() 計算與查詢匹配的文件數,且不考慮limit()和skip()的影響
Skip(size) 在返回文件前,跳過指定數量的文件
Sort(sort) 按DBObject引數sort指定的方式對遊標中的文件排序
toArray([max]) 從伺服器檢索所有的文件,並以列表的方式返回,如果指定了引數max,則只檢索指定數量的文件