-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Performance und Speicherprobleme
PostPosted: Thu Jul 02, 2009 12:20 pm 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hallo,

ich habe das Problem, dass ich eine bestehende Desktop-Anwendung via Hibernate an postgresql anwende. Leider kann ja nicht garantieren, dass eine Session gültig bleibt, womit lange transactions ausscheiden. Nun im jedem Dialog nachträglich dafür zu sorgen, dass alle Daten geladen werden ist sehr aufwendig. Daher habe ich mich für den Sesssion-per-Request Ansatz entschieden und fast alle Beziehungen auf eager gesetzt. Dies erschien auch deswegen hilfreich, weil bei den meisten Use-Cases eh alle Daten benötigt (i.d.R. zu einen späteren Zeitpunkt, aber auch alle auf einmal) werden.


Nun wo ich die Datenbank so langsam mit Daten befülle, braucht Hibernate alleine ca. 1,3 GB Speicher. Mir ist klar das dies durch die vielen Joins, weil ich immer ein n-tel der Datenbank und alle Tabellen lese, verursacht wird. Jetzt geht es noch irgendwie, aber es ist absehbar, dass es bald kracht.

Kann man diese Arbeit auf postgresql verlagern, da dies lokal wohl deutlich schneller und evtl. effizienter gehen würde?

Wenn ja wie?

Oder kann man hibernate so konfigurieren, dass er die Anfrage zerstückelt und dann nur mit Teilmenge weiterrechnet. Z. B. nach jedem Join eine Projection auf das gewünschte Resultat vornimmt?

Vielen Dank.

Viele Grüße Michael


Last edited by Urmech on Fri Jul 10, 2009 5:39 am, edited 3 times in total.

Top
 Profile  
 
 Post subject: Re: Performance und Speicherprobleme
PostPosted: Fri Jul 03, 2009 4:29 am 
Regular
Regular

Joined: Sun Sep 30, 2007 7:51 pm
Posts: 93
ehcache ?

http://ehcache.sourceforge.net/


Top
 Profile  
 
 Post subject: Re: Performance und Speicherprobleme
PostPosted: Fri Jul 03, 2009 4:52 am 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hallo,

Danke erstmal. Aber ich habe schon mit dem (EH-) Cache experimentiert. Jedoch ist das größte Problem, dass die VM zuviel Speicher benötigt und nicht durch Projektion optimiert wird, der Cache kann ja prinzipiell nur folgende Aufrufe optimieren, beim ersten bleibt alles beim alten.

Hier meine Abfrage:
Code:
       final Criteria c = s.createCriteria(CountryModel.class).add(
       Restrictions.eq("name", pk.getName())).add(
       Restrictions.eq("year", Integer.valueOf(pk.getYear()))).add(
       Restrictions.eq("type", pk.getType())).add(
       Restrictions.eq("comment", pk.getComment()));

       final Object loadedCountry = c.uniqueResult();


Diese erzeugt folgenden
SQL-Anfrage. ( Habe sie mir von Hibernate formatiert ausgeben lassen.)
... Habe die Anfrage entfernt, da nicht sehr informativ und wohl eher die meisten erschlagen haben wird (18 Seiten lang) ...

Ist es möglich dies auf einfache Art und Weise aus Stored Procedure in Postgresql umzustezen?

Falls ja wie und wie ruft man diese dann via Hibernate/Java auf? Bin auf diesem Gebiet leider ein totaler Anfänger. Das Sql ist leider auch nicht ganz trivial, so dass ich meinen Basis-SQL-Kenntnisse die Anfrage wohl nicht weiter optimieren kann.

Vielen Dank.

Viele Grüße Michael


Last edited by Urmech on Thu Jul 09, 2009 9:14 am, edited 2 times in total.

Top
 Profile  
 
 Post subject: Re: Performance und Speicherprobleme
PostPosted: Mon Jul 06, 2009 5:23 am 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hallo, habe meine Criteria in ein HQL-query umgewandelt und die Probleme scheinen auf den ersten Blick beseitigt.

Code:
      final Query q = s
         .createQuery("from CountryModel cm where cm.name = :name and cm.year = :year and cm.type = :type and cm.comment = :comment");
      q.setString("name", pk.getName().name());
      q.setInteger("year", pk.getYear());
      q.setString("type", pk.getType().name());
      q.setString("comment", pk.getComment());

      final Object loadedCountry = q.uniqueResult();



Verstehe nur nicht warum?

Bevorzuge eigentlich Criteria, da mehr zur Compiletime geprüft wird und daher weniger fehleranfällig ist. Habe allerdings auch gelesen, dass Criteria noch bei weitem nicht so gut implementiert sein soll, wie HQL.

Die erzeugte Abfrage ist leider zu lang zum posten (ausgedruckt !113! Seiten zu 18), es scheint jedoch als würde HQL keine einzige große Abfrage starten, sondern mehrere kleinere.

Stimmt dies?

Seltsam ist, dass auch get sich ähnlich verhält wie die Criteria-Abfrage. In einer naiven Abfrage, ob ein Objekt bereits in der DB ist oder nicht, hatte ich dies dummerweise versucht, dies anstatt eines einfachen HQL-Query (mit slecet auf ein key-atrribut) zu benutzen. Vor allem im Zusammenhang mit Eager-Fetching, ist dies nicht zu empfehlen.

Vielen Dank.

Viele Grüße Michael


Top
 Profile  
 
 Post subject: Re: Performance und Speicherprobleme
PostPosted: Fri Jul 10, 2009 7:52 am 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hallo,

leider war der Wechsel von Criteria zu HQL nur eine temporäre Lösung. Mit der Größe der Länder und der Datenbank an sich, verschärft sich das Problem wieder.
Zudem ist der Netzwektraffic recht hoch und die CPU-Auslastung auch.

Wäre dankbar, falls jemand noch Möglichkeiten zur Optimierung kennt. Z. B. würde ich gerne das Query komplett auf der DB laufen lassen und nur noch das Resultat über das Netz versenden. Zur Zeit scheint dies nicht der Fall zu sein.

Vielen Dank.

Viele Grüße Michael

PS: Das setzen von org.hibernate.cfg.Environment.MAX_FETCH_DEPTH auf 0-3 bringt eine deutliche Verbesserung. Muss mir aber noch das erzeugte SQL anschauen, um beurteilen zu können, ob das sinnvoll ist. Wenn ich den Wert richtig interpretiere schaltet er bei 0 die Joins aus, so dass jede Tabelle einzeln abgefragt wird. Was bei massiven eager-fetching wesentlich sinnvoller wäre, als Kreuzprodukte von vielen Tabellen zu erzeugen.

Jedenfalls, lassen erste Tests auf deutlich geringere Netzwerklast, deutlich bessere Performance und reduzierten Speicherverbrauch schließen. Die CPU-Last mus ich noch beobachten, aber dürfte wohl auch deutlich geringer sein.


Top
 Profile  
 
 Post subject: Re: Performance und Speicherprobleme
PostPosted: Tue Jul 21, 2009 5:19 am 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hi,
habe nun auch
Quote:
@Fetch(value = FetchMode.SELECT)

entdeckt.

Mal schauen, was dies bewirkt. Es müssten nun eigentlich alle Joins weg sein.

Allerdings war
org.hibernate.cfg.Environment.MAX_FETCH_DEPTH = 0 schon sehr erfolgreich.

Hoffe dies hilft mal jemanden ...

Viele Grüße Michael


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.