Hibernate: Session is closed!

Status
Nicht offen für weitere Antworten.

Samson_Miller

Bekanntes Mitglied
Hallo,

in meiner Anwendung wirft Hibernate nach einer noch unbestimmten Zeit eine Exception. Bei einem aktuellen Beispiel wird die Exception in einer DAO geworfen die eine SELECT-Abfrage an die Datenbank senden. Die DAO wird eine unbestimmte Anzahl erfolgreich durchlaufen. Nur auf einmal bekomme ich eine Exception das die Session geschlossen ist. Die Exception wird dann geworfen wenn versucht wird ein rollback durchzuführen. Es hilft dann nur noch den Tomcat neu zu starten.

Der Stacktrace:
Code:
org.hibernate.SessionException: Session is closed!
	at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
	at org.hibernate.impl.SessionImpl.getTransaction(SessionImpl.java:1314)
	at sun.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
	at $Proxy11.getTransaction(Unknown Source)
	at com.xx.xyz.comp.dao.Dao.rollback(Dao.java:36)
	at com.xx.xyz.comp.dao.XyDao.get(XyDao.java:38)
	at com.xx.xyz.action.ActionAbc.execute(ActionAbc.java:52)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:595)

Die XyDao:

Code:
public List get(String arg0) {
		try {
			super.setSessionFactory(context);
			super.begin();
			List liste = super.getSession().createQuery("FROM Tabelle WHERE name=:name").setString("name",arg0).list();
			super.commit();
			super.close();
			return liste;
		} catch (HibernateException e) {
			super.rollback();
			throw e;
		}
	}

Warum wird diese DAO eine gewisse Zeit lang erfolgreich gelaufen und wirft dann doch eine Exception?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
warum weiß ich nicht, nur dass du noch weniger weißt, als du wissen könntest,
das rollback() wird doch anscheinend durch eine 'HibernateException e' ausgelöst, schau dir doch diese einmal an, vielleicht gibt sie wichtige Hinweise,

bei deinem jetztigen Aufbau geht sie ja anscheinend komplett unter?
 

byte

Top Contributor
Es fehlen jegliche Informationen, wie Deine SessionFactory konfiguriert ist und wie Du die Session erzeugst. Ich gehe mal davon aus, dass Du Hibernate 3.x benutzt.

Du solltest Deine Session nicht per SessionFactory#openSession() öffnen sondern per SessionFactory#getCurrentSession(). Wenn Du nicht irgendeine komische Konfiguration gewählt hast, liefert diese Methode die momentan an die Transaktion gebundene Session. Bei Bedarf wird eine neue Session aufgemacht, wenn die letzte bereits geschlossen ist.

Für Webanwendungen bietet es sich an, das Open-Session-In-View Pattern anzuwenden.
 

Samson_Miller

Bekanntes Mitglied
Ja genau, ich benutzer Hibernate 3.

Die SessionFactory erstelle ich in einer anderen Dao, die in die XyDao eingebunden wird.

Code:
public class Dao {

	private static SessionFactory sessionFactory = null;
	
	protected Dao() {
	}

	public static Session getSession() {
		Session session = sessionFactory.getCurrentSession();
		if(session == null) {
			session = sessionFactory.openSession();
		}
		return session;
	}
	
	protected void begin() {
		getSession().beginTransaction();
	}

	protected void commit() {
		getSession().getTransaction().commit();
	}
   
	protected void rollback() {
		try {
			getSession().getTransaction().rollback();
		} catch( HibernateException e ) {
			log.info("Rollback nicht möglich",e);
			throw e;
		}
 
		try {
			getSession().close();
		} catch( HibernateException e ) {
			log.info("Schließen nicht möglich",e);
			throw e;
		}
	}
  
	public static void close() {
		getSession().close();
	}
	
	public static void setSessionFactory(ServletContext context) {
		sessionFactory=(SessionFactory)context.getAttribute("SessionFactory");
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}
 
S

SlaterB

Gast
stell dir mal vor, zwei Daos benutzen die gleiche SessionFactory,
beide holen sich dieselbe Session (sessionFactory.getCurrentSession()), einer schließt zuerst, der zweite schaut in die Röhre

schau dir die Exception an (dürfe dann aber auch nur 'Session is closed' oder so sein),
lass dein Programm loggen, was der Teufel hergibt,
welche Daos sind aktiv, wer holt wann getSession(), welche Session (hashCode oder neu eingeführte Id), wer ruf wann begin(), commit(), close() usw auf,
die Ausgabe ist dann ein schönes Log:

...
X holt Session 3423;
X beginnt Transaktion für Session 3423;
X closed Session 3423;
Y holt Session 3424;
Y beginnt Transaktion für Session 3424;
Y closed Session 3424;
...

wenn dann irgendwo

A holt Session 4002;
A beginnt Transaktion für Session 4002;
B holt Session 4002;
A closed Session 4002;
B wirft Exception: Session 4002 ist closed, wieso nur? bin traurig

auftaucht, dann wäre die Sache klar ;)


------


kann aber auch an ganz was anderem liegen ;)
 

Samson_Miller

Bekanntes Mitglied
Was mich nur wundert ist, dass ich immer an der gleichen Stelle in der Anwendung den Fehler bekomme. Auch wenn ich mich abmelde und wieder neu anmelde und ich auch nur ganz alleine mit der Anwendung arbeite. Ich bekomme immer die Fehlermeldung "Session is closed", obwohl dann doch eine neue Session aufgemacht werden sollte.
 

byte

Top Contributor
stell dir mal vor, zwei Daos benutzen die gleiche SessionFactory,
beide holen sich dieselbe Session (sessionFactory.getCurrentSession()), einer schließt zuerst, der zweite schaut in die Röhre

Ne, Du kannst den Kontext der "Current Session" konfigurieren. Normaweilerweise ist die Current Session an den Thread gebunden (ThreadLocalSessionContext). In Webanwendungen läuft jeder Request in einem eigenen Thread im Webcontainer. Wenn nun zwei Requests parallel auf der selben SessionFactory getCurrentSession() aufrufen, bekommt jeder seine eigene (thread-local) Session.

Das ganze lässt sich über das Property hibernate.current_session_context_class konfigurieren.


@Samson_Miller: Guck doch mal nach, in welcher Zeile die Exception genau fliegt!!

Das session.close() würde ich übrigens rausnehmen, wenn Du die Session per getCurrentSession() holst. Die Session wird automatisch beim commit() geschlossen.
 
Zuletzt bearbeitet:

Samson_Miller

Bekanntes Mitglied
Jetzt ist der Fehler wieder aufgetretten. Mit meiner Anwendung gehe ich gegen mehrere Datenbanken, die Fehlermeldung taucht aber immer nur bei einer Datenbank auf.

Wenn in der folgenden DAO:

Code:
public List get(String arg0) {
		try {
			super.setSessionFactory(context);
			super.begin();
			List liste = super.getSession().createQuery("FROM Tabelle WHERE name=:name").setString("name",arg0).list();
			super.commit();
			super.close();
			return liste;
		} catch (HibernateException e) {
			super.rollback();
			throw e;
		}
	}

die Funktion "super.getSession()" aufgerufen wird, wird folgendes Ausgeführt:

Code:
public static Session getSession() {
		Session session = sessionFactory.getCurrentSession();
               log.info("Die Session ist: "+session.isOpen());
		if(session == null) {
			session = sessionFactory.openSession();
		}
		return session;
	}

Wenn ich dort abfrage ob die Session geöffnet ist (session.isOpen()) wird in dem Fall "false" geliefert.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JSF Hibernate no session or session was closed Data Tier 12
E Hibernate: Session vs EntityManager Data Tier 3
S Hibernate - session-per-request/open session view oder was? Data Tier 3
T Hibernate/Spring JPA: eigene ID generieren Data Tier 5
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
D Hibernate Hibernate mit MariaDB Data Tier 1
ToBJo Hibernate Glassfish deploy mit Hibernate schlägt fehl Data Tier 1
C JPA Hibernate Map<String,String> richtig mappen Data Tier 2
S JPA Hibernate Search & EclipseLink (oder OpenJPA) Data Tier 0
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
ARadauer Hibernate Entität readonly laden... Data Tier 1
G Hibernate SQL in Hibernate: Keine Parameter mit Index? Data Tier 2
P Wildfly + Hibernate + SQL Server Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
B Hibernate und MySQL testen Data Tier 8
I Hibernate HQL: generiertes SQL ausgeben Data Tier 1
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
R Hibernate Hibernate und Logback Data Tier 2
R Hibernate möchte Schema zwei mal undeployen Data Tier 2
F Hibernate Hibernate / JPA Data Tier 4
C Hibernate Hibernate Code Generation Data Tier 3
S Hibernate Mehrfachverbindung mit Hibernate Data Tier 3
M Hibernate Einstiegsfrage Data Tier 5
M Exception in thread "main" org.hibernate.MappingException: java.lang.ClassNotFoundException: Message Data Tier 4
S Hibernate Einstieg in Hibernate 3.2 sinnvoll? Data Tier 8
P JPA Eigene Vererbungsstrategie mit JPA / Hibernate Data Tier 2
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
Y Jboss seam-hibernate-jpa Data Tier 5
RaoulDuke Hibernate Map<String,String> mit Annotations mappen Data Tier 2
M Hibernate Hibernate with GWT Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
pg1337 Hibernate Fragen Data Tier 11
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
2 Hibernate Annotations Data Tier 7
G Hibernate select update no wait Data Tier 8
Z Hibernate: Many-To-Many nur eine bestimmte Spalte Data Tier 3
K Hibernate - Envers - Erzeugung der SQL Skripte Data Tier 4
G Hibernate 1:n Beziehung mit Vererbung Data Tier 5
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
L Hibernate: failed to lazily initialize a collection of role Data Tier 3
S Hibernate hibernate.cfg.xml Data Tier 14
D JPA vs Hibernate.cfg und Entitymanager Data Tier 6
H Hibernate - Mapping für Enumeration Data Tier 1
R Hibernate Criteria Abfrageproblem Data Tier 2
A Hibernate und jdbc zusammen Data Tier 4
D Mit Hibernate aus JUnit ein DB-Schema erzeugen Data Tier 6
S [Hibernate] No Persistence provider for EntityManager Data Tier 5
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
G Hibernate HQL und Interface Data Tier 4
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
X [Hibernate] Zusammengesetzte Entities möglich? Data Tier 7
N Hibernate Fake? Data Tier 2
S Problem beim Insert mit Hibernate Data Tier 9
V Hibernate Projection Data Tier 2
T org.hibernate.impl.SessionFactoryImpl Memory Leak Data Tier 10
G Hibernate Composite key Data Tier 11
X [Hibernate] Connection Pool - MinSize ? Data Tier 2
R Hibernate Criteria OR Data Tier 2
T hibernate/jpa abgefragte Listen immer mit Null-Werten gefüllt Data Tier 8
X [Hibernate] Anderen Connection Pool - Vorschläge? Data Tier 3
ARadauer Hibernate DDL Loggen Data Tier 6
G Hibernate abfrage Collection Data Tier 3
X [Hibernate] ReverseEngineering - Eigene Strategy verwenden? Data Tier 3
R Hibernate Criteria .group größer als Data Tier 5
R Hibernate daten laden Data Tier 7
H [Hibernate]1:1 Beziehung Data Tier 8
H [Hibernate]No CurrentSessionContext configured! Data Tier 6
X [Hibernate] Lässt sich die Dauer eines SELECTs loggen? Data Tier 4
R Hibernate n:n Relationtabelle mit Date Data Tier 3
H [Hibernate] Unknown Entity Data Tier 3
H [Hibernate] Configuration Data Tier 3
C [Hibernate] Generierung von hbm.xml to Java Data Tier 4
lumo Eclipse & JPA & Hibernate & Derby Data Tier 5
J Zufallsauswahl aus ResultList bei JPA(Hibernate) / Performance Data Tier 3
M Hibernate: Datum 0001-01-01 erzeugt null-Datum Data Tier 4
G Datenbankzugriff mit Hibernate Data Tier 7
Y Hibernate - Angabe des Schemas Data Tier 6
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M Hibernate Mehr als 1 Object speichern? Data Tier 18
M Unerklärliche Hibernate Exception Data Tier 20
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9
haemi Viele DTOs in hibernate IdentityMap Data Tier 3
LadyMilka (hibernate) UNION dem Dialekt hinzufügen Data Tier 3
M Hibernate + Oracle 10g XE Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
P SQL PRoblem Hibernate? Data Tier 8
J Vererbung mit JPA / Hibernate - pro/contra Data Tier 3
T JBoss/Hibernate: Abfrage dauert lang + hohe CPU? Data Tier 19
7 Hibernate-Abfrage (SubSelect im FROM) Data Tier 2
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
G Layer für Datenbankzugriff Hibernate Data Tier 5
G Hibernate Zwischentabelle Data Tier 2
Java.getSkill() Hibernate und Spalte vom Typ xml Data Tier 6
G Hibernate 0...1 : 1 Beziehung Data Tier 6
G Hibernate mehrere @oneToone Data Tier 2

Ähnliche Java Themen

Neue Themen


Oben