優化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

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

 

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,則只檢索指定數量的文檔

 

 

 

 





   


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM