2012-10-10 1 views
0

최악의 경우 150,000 개 이상의 엔티티를 생성하는 쿼리가 있습니다. 아마 300,000k 개체의 상한선이있을 것입니다. 이 데이터 집합을 사용자에게 반환하는 여러 가지 방법을 시도했습니다. SQL Developer를 사용하여 쿼리를 실행하고 약 .348 초 만에 실행됩니다. 그래서 그것은 어떤 종류의 병목도 아닙니다. openJPA 쿼리에서 155000 개의 엔티티 생성하기

나는
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(); 
    } 

그 코드는 기본적으로이 쿼리를 조립 위 ...

... 그래서 같은 중첩 된 쿼리 ...

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

네이티브 쿼리가 같은 조립을 만들

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 레코드가 반환됩니다. 이제 기본적으로 결과를 Provider 객체로 변환하기 위해 아래 코드를 실행합니다.

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

여기는 예외가 발생하는 곳입니다. 이것은 JPA가 처리 할 수있는 너무 큰 데이터 집합입니까? 간단한 Java JDBC 연결과 일부 기본 Java 객체를 사용하여이 작업을 수행 할 수 있습니다. 하지만이 데이터 세트는 큰 것으로 작동합니까?

감사합니다.

UPDATE : 예외 난 당신이 JVM에 비해 너무 큰 데이터 세트를 사용하려고처럼 소리

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

아마 당신은 당신이 타격을 가하는 예외를 포함해야합니다 ....? – Rick

답변

3

을 얻고있다. 적은 수의 객체를 메모리로 가져 오거나 최대 힙을 늘릴 수 있습니다.

나는 또한 Large Result Sets을보고 싶습니다.

+0

제가 이것을 해결하기 위해 한 것은 jvm의 시작과 최대 힙 크기를 늘리는 것입니다. 그게 문제를 해결하는 것처럼 보였습니다. – SoftwareSavant

관련 문제