2012-10-10 45 views
0

我有一個查詢,在最壞的情況下會創建超過150K的實體。可能有30萬個實體的上限。我已經嘗試了幾種方法將這組數據返回給用戶......我使用sql Developer運行查詢,運行時間約爲.348秒。所以這不是任何形式的瓶頸。從openJPA查詢創建155000個實體

創建像這樣嵌套查詢...

List<Object[]> ObjList = (List<Object[]>) emf.createNativeQuery(assembleNestedQuery(query2)).getResultList(); 

的原生查詢組裝成這樣...

String query2 = assembleQuery(organizationIDs, 2); 

else if (type == 4){ 
    queryBuilder.append("SELECT t0.RESOURCE_ID, t0.FIRST_NAME, t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0"); 
    if(typeArgs.length > 0){ 
     queryBuilder.append(" WHERE t0.RESOURCE_ID IN (");    
     for(int i = 0 ; i <= typeArgs.length - 1; i++){ 
     if(i != typeArgs.length -1) 
      queryBuilder.append(typeArgs[i] +", "); 
     else 
      queryBuilder.append(typeArgs[i] +" "); 
     if((i % 1000 == 0) && (i != 0)){ 
      queryBuilder.append(") OR IN ("); 
     } 
    } 
    queryBuilder.append(")");    
      } 
    } 

private String assembleNestedQuery(String typeArgs2){ 
     StringBuilder queryBuilder = new StringBuilder(); 
     queryBuilder.append("SELECT t0.RESOURCE_ID, t0.FIRST_NAME, t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0"); 
     queryBuilder.append(" WHERE t0.RESOURCE_ID IN ("); 
     queryBuilder.append(typeArgs2); 
     queryBuilder.append(")"); 
     return queryBuilder.toString(); 
    } 

即上面的代碼基本上組裝此查詢...

SELECT t0.RESOURCE_ID, t0.FIRST_NAME, t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0 WHERE t0.RESOURCE_ID IN (SELECT DISTINCT d.RESOURCE_ID FROM EPCD13.RESOURCES d WHERE d.ORGANIZATION_ID in (...)) 

因此,嵌套查詢基本上是動態創建的... 查詢,我運行約有155K條記錄返回。現在我基本上運行下面的代碼將結果變成提供者對象...

List<Provider> provList = new ArrayList<Provider>(); 
for(Object[] obj: ObjList) 
{ 
    provList.add(this.GetProviderFromObj(obj)); 
} 

這就是發生異常的地方。這是JPA處理的一組數據嗎?我可以用一些簡單的Java JDBC連接和一些基本的Java對象來做到這一點。但是這組數據需要大量的工作嗎?

謝謝。

UPDATE:異常我正在

java.lang.OutOfMemoryError: caused by: java.lang.OutOfMemoryError 
+0

也許你應該包括你正在碰到的例外....? – Rick

回答

3

這聽起來像你想使用的數據集是JVM的太大。你可以將少量的對象拉入內存,或者你可以增加你的最大堆。

我也建議看看Large Result Sets

+0

我做了什麼來解決這個問題,在我的jvm中增加了起始和最大堆大小。這似乎解決了這個問題。 – SoftwareSavant