0

最悪の場合、150K 以上のエンティティを作成するクエリがあります。おそらく 300,000k エンティティの上限があります。この一連のデータをユーザーに戻す方法をいくつか試しました... sql Developer を使用してクエリを実行すると、約 .348 秒で実行されます。したがって、それはいかなる種類のボトルネックでもありません。

私はそのようにネストされたクエリを作成します...

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のレコードが返されます。ここで、基本的に以下のコードを実行して、結果を Provider オブジェクトに変換します...

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

そして、これが例外が発生している場所です。これは、JPA が処理するには大きすぎるデータ セットですか? これは、いくつかの単純な Java JDBC 接続といくつかの基本的な Java オブジェクトを使用して非常に簡単に行うことができます。しかし、このデータ セットは大きすぎて処理できないのでしょうか?

ありがとう。

更新:私が取得している例外

java.lang.OutOfMemoryError: caused by: java.lang.OutOfMemoryError
4

1 に答える 1

3

JVM には大きすぎるデータ セットを使用しようとしているようです。メモリに取り込むオブジェクトの数を減らすか、最大ヒープを増やすことができます。

Large Result Setsも参照することをお勧めします。

于 2012-10-10T18:15:02.110 に答える