Ich muss meine Web-App mit wirklich riesigen Datensätzen arbeiten lassen. Im Moment bekomme ich entweder OutOfMemoryException oder Ausgabe, die 1-2 Minuten generiert wird.Wie behandelt man große Datenmengen mit JPA (oder zumindest mit Hibernate)?
Sagen wir es einfach und nehmen wir an, dass wir 2 Tabellen in DB haben: Worker
und WorkLog
mit ungefähr 1000 Reihen in der ersten und 10 000 000 Reihen in der zweiten. Letztere Tabelle hat mehrere Felder einschließlich "workerId" und "Stunden Worked" Felder unter anderem. Was wir brauchen, ist:
zählen insgesamt Stunden von jedem Benutzer gearbeitet;
Liste der Arbeitsperioden für jeden Benutzer.
Der einfachste Ansatz (IMO) für jede Aufgabe im Klar SQL ist:
1)
select Worker.name, sum(hoursWorked) from Worker, WorkLog
where Worker.id = WorkLog.workerId
group by Worker.name;
//results of this query should be transformed to Multimap<Worker, Long>
2)
select Worker.name, WorkLog.start, WorkLog.hoursWorked from Worker, WorkLog
where Worker.id = WorkLog.workerId;
//results of this query should be transformed to Multimap<Worker, Period>
//if it was JDBC then it would be vitally
//to set resultSet.setFetchSize (someSmallNumber), ~100
So habe ich zwei Fragen :
- wie ich jeden meiner Ansätze mit JPA (oder zumindest mit Hibernate) umsetze;
- Wie würden Sie mit diesem Problem umgehen (mit JPA oder Hibernate natürlich)?
Versuchen Sie, einen Bericht zu erstellen, oder versuchen Sie, eine Reihe von Objekten zu laden? Wenn Sie nur versuchen, einen Bericht zu erstellen, dann tun Sie es in SQL, wie Sie sagten, und damit fertig sein. – Zak
@Zak: Ich habe eine Web-Anwendung in Jpa + Spring + Jsf, die funktioniert. Aber seine Leistung sollte besser sein. Und was noch wichtiger ist, es sollte in der Lage sein, viel größere Datenmengen zu verarbeiten, als es momentan möglich ist. 1) Es gibt ein Problem mit der ersten Abfrage, dass ich nicht weiß, wie man es in 'hql' oder' jpa query language' schreibt. Ich möchte nicht einfach sql verwenden, ich bin es ein letzter Ausweg. 2) Das Problem mit der zweiten Abfrage ist, dass ich nicht weiß, wie man die Abrufgröße in 'JPA' einstellt, und ich weiß auch nicht, wie ich diese Situation mit' JPA' behandeln soll: Es gibt keine Schleife durch die Ergebnismenge. Ich weiß, wie man den nächsten Abruf ausführt. – Roman