0

どうしても、私は通常自分で自分のものをデバッグし、そのための代替(肥大化したが機能している)ソリューションも手に入れましたが、次のバッチコードで論理エラーを理解できないようです:

private int records = 0;
private Query q;

public void BatchProcessor(String className)
        throws Exception {
    int pageSize = 1000;
    boolean done = false;
    List<Test> resultList = null;

    while (!done) {

        q.setFirstResult(records);
        q.setMaxResults(records+pageSize);
        System.out.println("records: "+records);            

        if (records % pageSize == 0) {
            em.clear();
        }

        resultList = q.getResultList();
        process(resultList);
    }
}

private void process(List<Test> list) {
    Iterator<Test> itAmount = list.iterator();
    while (itAmount.hasNext()) {
        Test dto = itAmount.next();
        records=records+1;
    }
}

出力は次のとおりです。

レコード:0
レコード:1000
レコード:3000
レコード:7000
レコード:15000
レコード:31000
..。

これは私を夢中にさせています。while()の各ループは、q.setFirstResult()の数が増えるにつれて再び「0」から始まり、リストが大きくなるように見えます。「メモリ不足」例外が発生するまで、リストは反復ごとに大きくなります。また、20000レコード、40000、50000などで印刷されない理由もわかりません。このコードの障害は完全にわかりません:(誰かヒントがありますか?

4

2 に答える 2

3

あなたはすべきではありませんq.setMaxResults(records+pageSize); あなただけがすべきですq.setMaxResults(pageSize);

あなたが増加するrecordsにつれてあなたが増加している場合MaxResults

Javadoc

クエリsetMaxResults(int maxResult)

取得する結果の最大数を設定します。

records+pageSizeあなたの価値のためにリストは増えています

records= 0 MaxResults = 1000;
records= 1000 MaxResults = 2000;

それは常にのようでなければなりません

records= 0 MaxResults = 1000;
records= 1000 MaxResults = 1000;
records= 2000 MaxResults = 1000;
于 2012-09-06T12:39:37.993 に答える
1

doneがtrueに設定されることはないため、永久にループします。

次に、レコードは0、次に1000、次に3000、次に7000、...に設定されます。

したがって、出力も正常です...

private int records = 0;
private Query q;

public void BatchProcessor(String className)
        throws Exception {
    int pageSize = 1000;
    int nbofloops = 0;
    boolean done = false;
    List<Test> resultList = null;

    while (!done) {

        q.setFirstResult(pageSize * nbofloops++;);
        q.setMaxResults(pageSize);
        System.out.println("records: "+records);            

        if (records % pageSize == 0) {
            em.clear();
        }

        resultList = q.getResultList();
        process(resultList);
    }
}

private void process(List<Test> list) {
    Iterator<Test> itAmount = list.iterator();
    while (itAmount.hasNext()) {
        Test dto = itAmount.next();
        records=records+1;
    }
}
于 2012-09-06T12:45:18.847 に答える