Hibernate Sessionmanagement

casi91

Bekanntes Mitglied
Hallo Community,
ich habe mal wieder eine Frage bezüglich Hibernate.

Wie ich zu begin meiner einarbeitung in Hibernate gelesen hatte, soll eine Session immer nur eine kurze Lebensdauer haben.
Das habe ich auch so umgesetzt, indem ich in jeder Methode, die in einem DAO-Objekt ausgeführt werden, eine neue Session zur verfügung Stelle und diese am Ende der Methode entsprechend wieder schließe.

Das hat bisher auch immer wunderbar geklappt und ich war zufrieden mit Ergebnis und Performance.
Unter meinen DAO-Methoden gibt es nun auch folgende Methode:
Java:
public Object[] searchKunde(Object[] searchData) {
		Object[] filialen 	= null;
		Session session 	= null;
		session 			= HibernateUtil.getSession();
		try {
		Criteria crit 		= session.createCriteria(Filiale.class);			
		String keineCrit	= crit.toString();
		
		crit				= searchKundeOrt((String) searchData[KDNR], 
				(String)searchData[BEZ], (String)searchData[ORT], crit);
		crit 				= searchKundeUBranche((String) searchData[KDNR], 
				(Unterbranche[]) searchData[BRANCHE], crit);
		crit				= searchKundeByKontakt(crit, (Integer[]) searchData[KONTIDS]);		
		crit				= searchKundeByStatus(crit, (Object[]) searchData[STATUS]);
		
		crit				= searchKundeByKreis(crit, (Object[]) searchData[KREIS]);
		crit				= searchKundeByLand(crit, (Object[]) searchData[LAND]);
		crit				= searchKundeByBundesland(crit, (Object[]) searchData[BLAND]);
		crit				= searchKundeByKategorie(crit, (Object[]) searchData[KATEGOR]);
		crit				= searchKundeByAdressherkunft(crit, (Object[]) searchData[ADRHERK]);
		crit				= searchKundeVertriebsschiene(crit, (Object[]) searchData[VERTSCH]);
		crit				= searchKundeSoftware(crit, (Object[]) searchData[SOFTWAR]);
		crit				= searchKundeSystemplattform(crit, (Object[]) searchData[HARDWAR]);
		crit				= searchKundeVerbaende(crit, (Object[]) searchData[VERBAND]);
		crit				= searchKundeNrVonBis(crit, (String) searchData[KDNRVON], 
				(String) searchData[KDNRBIS]);
		crit				= searchKundePLZVonBis(crit, (String) searchData[PLZVON], 
				(String) searchData[PLZBIS]);
		crit				= searchKundeWdhVonBis(crit, (String) searchData[WDHVON], 
				(String) searchData[WDHBIS]);
		crit				= searchKundeUmsatzVonBis(crit, (String) searchData[UMSATZVON], 
				(String) searchData[UMSATZBIS]);
		crit				= searchKundeMaAnzVonBis(crit, (String) searchData[MAANZVON], 
				(String) searchData[MAANZBIS]);
		crit				= searchKundeFlaecheVonBis(crit, (String) searchData[FLAECHEVON], 
				(String) searchData[FLAECHEBIS]);
		crit				= searchKundeFilAnzVonBis(crit, (String) searchData[FILANZVON], 
				(String) searchData[FILANZBIS]);
		crit				= searchKundeZeitraumKontaktVonBis(crit, 
				(String) searchData[KONTZEITVON], (String) searchData[KONTZEITBIS]);
		crit				= searchKundeByVertBeauf(crit, (Object[]) searchData[VERTBEAUF]);
		if (searchData[WERBESE] != null && searchData[KWERBSE] != null) {
			crit			= searchKundeWerbesendung(crit, (boolean) searchData[WERBESE], 
					(boolean) searchData[KWERBSE]);
		}
		String text 		= crit.toString();
		if (!text.equals(keineCrit)) {
			crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);	
			List<?> domainListe = crit.list();
			filialen		= domainListe.toArray();
		} else {
			filialen		= new Object[0];
		}
		} catch (Exception e) {
			System.out.println(e.getMessage());
			filialen		= new Object[0];
		} finally {
			session.close();
		}
		return filialen;			
	}
Hierbei wird anhand von Suchkriterien ein Criteria zusammengestellt und dann die entsprechende Abfrage ausgeführt.
Die Methode an sich, tut genau das was Sie soll.

Nun zu meinem Problem,
Es gibt Situationen in meinem Programm, bei denen bei dem Aufruf dieser Methode ein Array mit 2000 Filialen zurückgegeben wird.
Nun muss ich mir dann die Daten zu diesen Filialen nehmen und in einer Tabelle anzeigen.
Da meine Filial-Klasse auch Collections beinhaltet die den FetchType "LAZY" haben, muss ich entsprechend eine neue Session öffnen und die Filiale aktualisieren, da ich sonst eine Exception bekomme "keine Session vorhanden, oder Session geschlossen" (oder so ähnlich)

Ich hatte schonmal in der obigen Methode das "session.close" weggelassen. Dann musste ich später keine neue Session aufbauen und mein Filialobjekt auch nicht aktualisieren.
--> Daten deutlich schneller vorhanden.

Meine Frage ist es nun, wie ich die Session besser managen kann, damit ich eben nicht jedes dieser 2000 Filialobjekte erneut aktualisieren muss, um an die Collections zu kommen.

Rein von der theorie müsste doch aber mein obiger Ansatz stimmen, am Ende der Methode die Session zu schließen, oder sehe ich das falsch?

Ich hoffe mein Problem ist verständlich beschrieben.
Und danke schonmal für jede Antwort :)
 

brauner1990

Bekanntes Mitglied
Wie hast du Hibernate konfiguriert bzgl des Caches?
-> Cache erhöhen / einrichten und es könnte auch bereits performance bringen

Die Session durchzuschleifen sehe ich als ineffektiv an und ist es hier falsch oder wirkllich das du dauernd die crit überschreibst?
 

casi91

Bekanntes Mitglied
Danke für deine Antwort,

Derzeit benutze ich nur die Standardeinstellungen für das Cachen.
Bin mich hierbei aber auch noch am einlesen.

Und das crit wird nicht überschrieben sondern erweitert.
Das Criteria wird in den Parametern mitgegeben, erweitert und zurückgegeben.
 

Neue Themen


Oben