一次針對批量查詢處理的優化

 客戶調用批量查詢接口對Solr核進行查詢時以爲查詢響應時間有些慢,接口的內部實現目前是順序執行每一個查詢,再把結果彙總起來返回給調用方。所以,考慮引入線程池對查詢接口的內部實現進行重構優化。java

       先聲明一個大小可隨之增加的線程池,
 
  
  
  
  
  1. private ExecutorService executor = Executors.newCachedThreadPool();//查詢請求處理線程池 

而後是主線程方法的代碼: public Listsql

 

  
  
  
  
  1. List<Map<String, String>> finalResult = null
  2.        if (idList == null || idList.size() == 0 || StringUtil.isBlank(entityCode)) {//參數合法性校驗 
  3.            return finalResult; 
  4.        } 
  5.        finalResult = new ArrayList<Map<String, String>>(); 
  6.         
  7.        List<Future<Map<String, String>>> futureList = new ArrayList<Future<Map<String, String>>>(); 
  8.        int threadNum = idList.size();//查詢子線程數目 
  9.        for (int i = 0; i < threadNum; i++) { 
  10.            Long itemId = idList.get(i); 
  11.            Future<Map<String, String>> future = executor.submit(new QueryCallable (entityCode, itemId)); 
  12.            futureList.add(future); 
  13.        } 
  14.        for(Future<Map<String, String>> future : futureList) { 
  15.            Map<String, String> threadResult = null
  16.            try { 
  17.                threadResult = future.get(); 
  18.            } catch (Exception e) {  
  19.                threadResult = null
  20.            } 
  21.            if (null != threadResult && threadResult.size() > 0) {//結果集不爲空 
  22.                finalResult.add(threadResult); 
  23.            } 
  24.        } 
  25.        return finalResult; 
  26.    } 

最後是具體負責處理每一個查詢請求的Callableapache

 

  
  
  
  
  1. public class QueryCallable implements Callable<Map<String, String>> { 
  2.         private String entityCode = ""
  3.         private Long itemId = 0L; 
  4.          
  5.         public GetEntityListCallable(String entityCode, Long itemId) { 
  6.             this. entityCode = entityCode; 
  7.             this.itemId = itemId; 
  8.         } 
  9.         public Map<String, String> call() throws Exception { 
  10.             Map<String, String> entityMap = null
  11.             try { 
  12.                 entityMap = QueryServiceImpl.this.getEntity(entityCode, itemId);//先去hbase查基本信息 
  13.  
  14.             } catch (Exception e) { 
  15.                 entityMap = null
  16.             } 
  17.             return entityMap; 
  18.         } 
  19.     } 

經過線程池的使用,能夠減小建立,銷燬進程所帶來的系統開銷,並且線程池中的工做線程能夠重複使用,極大地利用現有系統資源,增長了系統吞吐量。app

另外,今天也嘗試了另外一種合併Solr索引的方法,直接經過底層的Lucene的API進行,而不是提交Http請求,具體方法以下:ide

java -cp lucene-core-3.4.0.jar:lucene-misc-3.4.0.jar org/apache/lucene/misc/IndexMergeTool ./newindex ./app1/solr/data/index ./app2/solr/data/index 優化

相關文章
相關標籤/搜索