PostgreSQL JPA und Hibernate - Verbindung zur DB

fsicher

Bekanntes Mitglied
Hallo allerseits

Ich bin etwas ratlos ...

Habe eine Web-Anwendung mit JSF 2.x impelementiert und das funktioniert. Für die Persistierung wird JPA mit Hibernate eingesetzt, als Db wird PostgreSQL 9.x verwendet. Allerdings erlebe ich immer wieder, dass die Verbindung zur Datenbank nicht aufgebaut werden kann!

Die Anwendung läuft auf einem separaten Server, auf dem sowohl Tomcat 7.0.16 (Servlet-Container) als auch PostgreSQL 9.x installiert sind. Wenn Tomcat neu gestartet wird, funktioniert es einwandfrei und ich kann problemlos alle Aktionen ausführen, die in der Anwendung verfügbar sind. Vergeht aber eine gewissen Zeit (kann nicht exakt sagen, wie lange es gehen muss), werde ich schon beim Versuch, mich anzumelden, mit folgender Meldung verabschiedet:

[XML]
javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255)
at ch.hslu.suj.rooms.dao.PersonDAO.getAll(PersonDAO.java:141)
[/XML]

Die Methode getAll sieht wie folgt aus:

Java:
public static List<Person> getAll() throws Exception {
	List<Person> userList = null;
	EntityManager em = null;

	try {
		em = HibernateUtil.getEntityManagerFactory().createEntityManager();
		TypedQuery<Person> q = em.createQuery(
				"SELECT u FROM Person u ORDER BY u.id", Person.class);

		userList = q.getResultList();  // Zeile 141
	} catch (Exception e) {
		logger.error("Fehler beim Holen aller User-Objekte: ", e);
		throw e;
	} finally {
		if (em != null && em.isOpen()) {
			em.close();
		}
	}

	if (userList != null) {
		return userList;
	} else {
		return new ArrayList<Person>();
	}
}

Wenn ich Tomcat wieder neu starte, funktioniert alles einwandfrei.

Bevor ich da weiter suche: hat jemand solche Erfahrungen schon gemacht und woran könnte es liegen? Könnte es sein, dass die Verbindung zur Db (über PersistenceUnit) nach einer Zeit abgebaut wird (aus Sicherheitsgründen oder was auch immer)? Oder, könnte dies mit Konfigurationen des Servers zu tun haben (dieser wird nicht von mir administriert)?

Danke für jeden Tipp.
 
Zuletzt bearbeitet:
Das ist nicht der ganze Stacktrace, weiter unten/oben solltest du die eigentliche Ursache finden, wahrscheinlich eine gepoolte Connection die durch einen Servertimeout ungültig wurde.
 
Der ganze Stacktrace sieht wie folgt aus:

[XML]
[2011-08-05 10:52:12,988 / ERROR] (PersonDAO.java:143) - Fehler beim Holen aller User-Objekte:
javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255)
at ch.hslu.suj.rooms.dao.PersonDAO.getAll(PersonDAO.java:141)
at ch.hslu.suj.rooms.business.PersonManager.findAll(PersonManager.java:583)
at ch.hslu.suj.rooms.webgui.bean.user.SearchUpdateUserBean.findAll(SearchUpdateUserBean.java:283)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:935)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:286)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:272)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1730)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2536)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
... 35 more
Caused by: org.postgresql.util.PSQLException: Eingabe/Ausgabe-Fehler {0} beim Senden an das Backend.
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:216)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
at org.hibernate.loader.Loader.doQuery(Loader.java:802)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
... 43 more
Caused by: java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:147)
at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:135)
at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:104)
at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73)
at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:259)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1164)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:190)
... 51 more
[/XML]

Aber, ich werde daraus nicht schaluer ;(

Danke.
 
Code:
java.net.SocketException: Software caused connection abort: recv failed
Na also 😉

Wie genau wird der JDBC Treiber und ConnectionPool konfiguriert?
 
Ich habe es mit persistence.xml gemacht:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="roomsPU" transaction-type="RESOURCE_LOCAL">

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<properties>
<property name="hibernate.connection.username" value="test_user" />
<property name="hibernate.connection.password" value="test_password" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc😛ostgresql://xxx.xxx.xxx.xxx:58960/demo_db" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
</properties>

</persistence-unit>
</persistence>
[/XML]

Reicht das nicht bzw. muss da noch was mehr?
 
Sieht so aus als ob du gar keinen ConnectionPool verwendest, dieser bietet meist Optionen dafür an, um den Timeout zu setzen.
 
Ich habe es inzwichen mit einer lokalen Installation getestet. Wenn ich eine Weile nichts mache, wird der "Zugriff verweigert" und ich werde zum Login weitergeleitet (an sich wie gewünscht). Danach kann ich mich aber problemlos wieder anmelden und weiter arbeiten. Bei dem echten Server bekomme ich das Problem, wenn die Verbindung länger als 10 Minuten inaktiv bleibt.

Sieht so aus als ob du gar keinen ConnectionPool verwendest, dieser bietet meist Optionen dafür an, um den Timeout zu setzen.

Ich verwende ConnectionPool nicht, da keine grosse Belastung erwartet wird. Mit ConnectionPooling habe ich auch keine Erfahrung: werde mich jetzt damit halt befassen müssen.

Vielen Dank.
 

Zurück
Oben