# Statusabfrage einer Hibernate-Abfrage



## Chris84hh (25. Mai 2009)

Moin,

ich habe eine Java-Anwendung in der ich mit Hibernate/JPA ~2000 Einträge einer Datenbank abfrage. Das dauert knapp eine Minute. Ich würde nun gerne in meiner Application einen Status anzeigen über die Zeit die noch benötigt wird oder wieviele Einträge er bisher gelesen/erstellt hat. 

Ist so etwas bei Hibernate möglich.. vielleicht über einen Listener oder so?

gruß Chris


----------



## kama (25. Mai 2009)

Hi,

ich wüsste jetzt nicht wo man einen Listener dafür in Hibernate setzen könnte....abgesehen davon wird das warscheinlich auch schwierig, da der JDBC treiber diese Arbeit macht....

Was mich viel mehr wundert ist die Angabe ~2000 ca. 1 Minute kommt mir sehr langsam vor? 

Mit freundlichem Gruß
Karl Heinz Marbaise


----------



## byte (25. Mai 2009)

Sowas wäre nur denkbar, wenn man mit Query#iterate() oder vielleicht noch Query#scroll() arbeitet. DBs unterstützen sowas afaik nicht.


----------



## Chris84hh (25. Mai 2009)

Die eine Minute Ladezeit kommt denke ich zustande, da ich die Objekte teilweise mit eagerload verknüpft habe, damit ich die später zur Verfügung habe.

Ich dachte vielleicht kann Hibernate nach jedem erstellten Objekt nen Status geben oder so.


----------



## byte (25. Mai 2009)

Du kannst das recht einfach prüfen, was bei Dir wirklich langsam ist. Lass Dir das von Hibernate erzeugte SQL ausgeben. Dann feuerst Du das SQL mal händisch mit einem DB-Tool ab. Du kannst dann schon beobachten, ob wirklich Hibernate in Deinem Fall langsam ist oder die Datenbank / das Statement.

Ich tippe, dass das Statement bei Dir langsam ist. Wenn das so ist, dann würde ich da erstmal optimieren, um das schneller zu kriegen.

Wenn Du wirklich richtige viele Objekte abfragen willst, dann guck Dir umbedingt mal das Kapitel über Batch Processing an in der Hibernate Doku.


----------



## maki (25. Mai 2009)

> Die eine Minute Ladezeit kommt denke ich zustande, da ich die Objekte teilweise mit eagerload verknüpft habe, damit ich die später zur Verfügung habe.


Eager loading kann zu solchen Performanceinbrüchen führen, nicht umsonst ist die Standardeinstellung Lazy, auch das sog. N+1 Problem kann zu Performaceproblemen führen.
Würde mir wie von byto gesagt die SQL Statements ansehen.


----------



## Chris84hh (25. Mai 2009)

Das ist ne minimale SQL Anweisung..

```
final String queryString = "select model from Request model where model.requestQueue= :value AND model.request is null";
```

..das geht auch mit dem querybrowser sehr fix.. Das werden wohl die Objekte sein die wiederum mehrere Listen mit Objekten halten die per eagerloading geladen werden müssen damit ich diese auch über RMI verwenden kann.

Naja ich kann ja den schönen 'spinning beach ball of death' als Ladesymbol einbauen..


----------



## maki (25. Mai 2009)

> Das werden wohl die Objekte sein die wiederum mehrere Listen mit Objekten halten die per eagerloading geladen werden müssen damit ich diese auch über RMI verwenden kann.


Also liegt es am Eager loading, würde da wieder auf Lazy umstellen und dann Fetch Queries verwenden wenn die Objekte ausserhalb der Session verwendet werden sollen.


----------



## Chris84hh (26. Mai 2009)

Ja, dann werde ich nochmal über die Abhängigkeiten gucken, was ich da noch wegnehmen kann.

Dann bedanke ich mich erstmal soweit..


----------



## byte (26. Mai 2009)

Maki hat recht. Du solltest alle Referenzen auf andere Entities per Left Join Fetch direkt mitladen. Auf diese Weise kannst Du die Performance u.U. drastisch erhöhen. Bei zu vielen Joins kann man auch prima das Nachladen des Objektgraphen manuell auf 2 oder mehr Statements aufbrechen. Der First Level Cache erledigt alles übrige.


----------



## Chris84hh (26. Mai 2009)

byto hat gesagt.:


> Du solltest alle Referenzen auf andere Entities per Left Join Fetch direkt mitladen.


Was ist ein left join fetch..? Ich bin nicht sooo fit in SQL.. und google liefert mir nichts was mich erleuchtet.


----------



## maki (26. Mai 2009)

Das ist kein SQL, sondern HQL und gleichzeitig der "richtige" Weg um lazy Collections/Attribute mitzuladen, denn alles auf Eager zu stellen geht in der Realität nicht, die Performance bricht ein.

https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html


----------

