ฉันเคยสงสัยตัวเองนี้ ดูเหมือนว่าจะมีความสำคัญ:
- ชุดข้อมูลของคุณใหญ่แค่ไหน (แถว)
- คุณใช้ JPA อะไร
- คุณกำลังประมวลผลแบบไหนสำหรับแต่ละแถว
ฉันได้เขียน Iterator เพื่อให้ง่ายต่อการสลับทั้งสองวิธี (findAll vs findEntries)
ฉันแนะนำให้คุณลองทั้งสองอย่าง
Long count = entityManager().createQuery("select count(o) from Model o", Long.class).getSingleResult();
ChunkIterator<Model> it1 = new ChunkIterator<Model>(count, 2) {
@Override
public Iterator<Model> getChunk(long index, long chunkSize) {
//Do your setFirst and setMax here and return an iterator.
}
};
Iterator<Model> it2 = List<Model> models = entityManager().createQuery("from Model m", Model.class).getResultList().iterator();
public static abstract class ChunkIterator<T>
extends AbstractIterator<T> implements Iterable<T>{
private Iterator<T> chunk;
private Long count;
private long index = 0;
private long chunkSize = 100;
public ChunkIterator(Long count, long chunkSize) {
super();
this.count = count;
this.chunkSize = chunkSize;
}
public abstract Iterator<T> getChunk(long index, long chunkSize);
@Override
public Iterator<T> iterator() {
return this;
}
@Override
protected T computeNext() {
if (count == 0) return endOfData();
if (chunk != null && chunk.hasNext() == false && index >= count)
return endOfData();
if (chunk == null || chunk.hasNext() == false) {
chunk = getChunk(index, chunkSize);
index += chunkSize;
}
if (chunk == null || chunk.hasNext() == false)
return endOfData();
return chunk.next();
}
}
ฉันลงเอยด้วยการไม่ใช้ตัววนซ้ำชิ้นส่วนของฉัน (ดังนั้นจึงอาจไม่ผ่านการทดสอบ) อย่างไรก็ตามคุณจะต้องมีคอลเล็กชันของ Google หากคุณต้องการใช้