我有一個查詢,在最壞的情況下會創建超過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
也許你應該包括你正在碰到的例外....? – Rick