Ich versuche, Datensatz aus der Datenbank mit Hibernate scrollbare Ergebnis und mit Bezug von this Github Projekt, ich habe versucht, jeden Datensatz als Chunk-Antwort zu senden.Wie liest man alle Datensätze aus der Tabelle (> 10 Millionen Datensätze) und bedient jeden Datensatz als Antwort auf einen Teil?
Controller:
@Transactional(readOnly=true)
public Result fetchAll() {
try {
final Iterator<String> sourceIterator = Summary.fetchAll();
response().setHeader("Content-disposition", "attachment; filename=Summary.csv");
Source<String, ?> s = Source.from(() -> sourceIterator);
return ok().chunked(s.via(Flow.of(String.class).map(i -> ByteString.fromString(i+"\n")))).as(Http.MimeTypes.TEXT);
} catch (Exception e) {
return badRequest(e.getMessage());
}
}
Service:
public static Iterator<String> fetchAll() {
StatelessSession session = ((Session) JPA.em().getDelegate()).getSessionFactory().openStatelessSession();
org.hibernate.Query query = session.createQuery("select l.id from Summary l")
.setFetchSize(Integer.MIN_VALUE).setCacheable(false).setReadOnly(true);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
return new models.ScrollableResultIterator<>(results, String.class);
}
Iterator:
public class ScrollableResultIterator<T> implements Iterator<T> {
private final ScrollableResults results;
private final Class<T> type;
public ScrollableResultIterator(ScrollableResults results, Class<T> type) {
this.results = results;
this.type = type;
}
@Override
public boolean hasNext() {
return results.next();
}
@Override
public T next() {
return type.cast(results.get(0));
}
}
Für Testzwecke, ich bin h Wenn 1007 Datensätze in meiner Tabelle gespeichert sind, gibt es immer 503 Datensätze zurück, wenn ich diesen Endpunkt anrufe.
Aktiviert AKKA Protokollebene DEBUG und versuchte es wieder, es die folgende Zeile für 1007 mal 2016-07-25 19:55:38 +0530 [DEBUG] from org.hibernate.loader.Loader in application-akka.actor.default-dispatcher-73 - Result row:
Aus dem Protokoll protokolliert i bestätigen, dass sie alle zu holen, konnte aber nicht kommen, wo die restlichen links bekam.
Ich habe die gleiche Abfrage in meiner Workbench und ich exportiere es in eine Datei lokal und verglich es mit der Datei generiert durch den Endpunkt, behalten LHS-Datensatz vom Endpunkt generiert und RHS-Datei von Workbench exportiert. Übereinstimmungen in der ersten Zeile, zweite und dritte stimmen nicht überein. Danach hat es Matches für alternative Aufnahmen bis zum Ende bekommen.
Bitte korrigieren Sie mich, wenn etwas falsch tut, und schlage ich ist dies der richtige Ansatz für für große db Aufzeichnungen CSV generiert.
Zu Testzwecken habe ich die CSV-Konvertierungslogik in meinem obigen Snippet entfernt.
hasNext Anrufe weiter. Ich würde annehmen, dass hasNext nichts (dh nur Überprüfungen) tut, während der nächste interne Cursor weitergeht? – rethab