최악의 경우 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
아마 당신은 당신이 타격을 가하는 예외를 포함해야합니다 ....? – Rick