どうしても、私は通常自分で自分のものをデバッグし、そのための代替(肥大化したが機能している)ソリューションも手に入れましたが、次のバッチコードで論理エラーを理解できないようです:
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などで印刷されない理由もわかりません。このコードの障害は完全にわかりません:(誰かヒントがありますか?