DB Connection Timout

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich habe ein kleines Webprojekt unter Verwendung des Glassfish Application Server V2 sowie TopLink JPA.
In der Glassfish Admin Konsole hab ich einen MySQL Connection pool erstellt, den ich über die persistence.xml
einbinde. Wenn ich meine Anwendung starte, läuft auch alles problemlos, die Verbindung zur Datenbank wird hergestellt, und ich kann SQL-Befehle ausühren.

Wenn die Anwendung aber ein paar Minuten läuft, und ich dann erneut Daten von der DB holen will,scheitert das ganze mit einer Exception, das keine neue Connection hergestellt werden konnte.

Ich vermute mal, es liegt am Timeout Property im ConnectionPool. Aber warum wird dann keine neue Connection erzeugt?

Hier ist der relevante Teil meiner Bean Klasse, die den EntityManager erzeugt:

Code:
@PersistenceUnit
EntityManagerFactory emf;

public String getText() {
  EntityManager em = null;
  try {
    em = emf.createEntityManager();
    Query q = em.createNamedQuery("TUser.findAll");
    ....
   } finally {
      if (em != null) {
        em.close();
      }
   }
}

Hier ist der Stacktrace:

Code:
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0 (Build b58g-fcs (09/07/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: null
Error Code: 0
Call: SQLCall(SELECT ID, PASSWORD, EMAIL, USERNAME, ACTIVE, CREATED FROM TUSER)
Query: ReportQuery(demo.entities.TUser)
	at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:305)
	at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:150)
	at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)
	at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.connect(DatasourceAccessor.java:233)
	at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.connect(DatabaseAccessor.java:242)
	at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.reconnect(DatasourceAccessor.java:436)
	at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.reconnect(DatabaseAccessor.java:1177)
	at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:220)
	at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:479)
	at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:452)
	at oracle.toplink.essentials.threetier.ServerSession.executeCall(ServerSession.java:473)
	at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
	at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:214)
	at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:285)
	at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:615)
	at oracle.toplink.essentials.internal.queryframework.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2416)
	at oracle.toplink.essentials.internal.queryframework.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2382)
	at oracle.toplink.essentials.queryframework.ReportQuery.executeDatabaseQuery(ReportQuery.java:802)
	at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:628)
	at oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:692)
	at oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:746)
	at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2233)
	at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:952)
	at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:924)
	at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:367)
	at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.getResultList(EJBQueryImpl.java:478)
	at demo.Bean.getUsers(Bean.java:73)
	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 javax.el.BeanELResolver.getValue(BeanELResolver.java:261)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:143)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
	at com.sun.el.parser.AstValue.getValue(AstValue.java:138)
	at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:206)
	at com.sun.faces.application.ValueBindingValueExpressionAdapter.getValue(ValueBindingValueExpressionAdapter.java:102)
	at javax.faces.component.ValueExpressionValueBindingAdapter.getValue(ValueExpressionValueBindingAdapter.java:73)
	at javax.faces.component.UIData.getValue(UIData.java:582)
	at org.ajax4jsf.component.UIDataAdaptor.getValue(UIDataAdaptor.java:1459)
	at org.ajax4jsf.component.SequenceDataAdaptor.getDataModel(SequenceDataAdaptor.java:70)
	at org.ajax4jsf.component.SequenceDataAdaptor.createDataModel(SequenceDataAdaptor.java:64)
	at org.ajax4jsf.component.UIDataAdaptor.getExtendedDataModel(UIDataAdaptor.java:592)
	at org.ajax4jsf.component.UIDataAdaptor.walk(UIDataAdaptor.java:994)
	at org.richfaces.renderkit.AbstractRowsRenderer.encodeRows(AbstractRowsRenderer.java:107)
	at org.richfaces.renderkit.AbstractRowsRenderer.encodeRows(AbstractRowsRenderer.java:92)
	at org.richfaces.renderkit.AbstractRowsRenderer.encodeChildren(AbstractRowsRenderer.java:139)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:245)
	at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176)
	at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:270)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:339)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:261)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:212)
	at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:361)
	at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
	at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: java.sql.SQLException: Error in allocating a connection. Cause: null
	at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:115)
	at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:145)
	... 92 more
 

byte

Top Contributor
Wenn ich mich richtig erinnere, ist der MySQL Timeout der Connections per Default bei 8 Stunden oder so. Wenn Du die Exception schon nach ein paar Minuten bekommst, ist das komisch. Welchen Connection Pool benutzt Du denn? Und wie hast Du den konfiguriert? Kenne TopLink nicht, aber hatte ähnliche Probleme mit Hibernate (jedoch erst nach Ablauf der 8 Stunden durch MySQL). Benutze nun C3P0 als Connection Pool und alles funktioniert: http://www.hibernate.org/214.html
 
G

Guest

Gast
Hi byto.

Vielen Dank, ich habe mal deine Einstellungen verwendet. Allerdings änderte sich bei mir nichts an dem Verhalten.

Komischerweise hab ich das Problem inzwischen anders beheben können: In dem ich die Connection Pool Property
"Non Transactional Connections" auf Enabled gesetzt habe.

Ist das Pflicht für mySQL? Bzw. warum hängt das mit meinem Problem zusammen? Mir fehlt da etwas der Background.

Danke und Gruß
Christian
 

byte

Top Contributor
Hm, ich habe das Gefühl, dass das eher was mit Top Link zu tun hat. Schätzungsweise hängen die Connections per Default an der Transaktion und werden nach dem commit geschlossen. Benutzt Du denn überhaupt Transaktionen für die DB-Anfragen?
Arbeite wie gesagt nur mit Hibernate und kenne TopLink nicht. Klingt aber nicht danach, dass es ein MySQL Problem ist. Dort ist es per Default so, dass das Connection Timeout erst nach 8 Stunden kommt, wobei man diesen Wert aber auch verändern kann. Das heisst, wenn Du eine Connection nach 8 Stunden Inaktivität benutzen willst, dann krachts.
 
G

Guest

Gast
Nein, Transaktionen hab ich bisher nicht verwendet, bzw. auto-commit ist auch nicht aktiviert.

Wird denn bei Hibernate beim Aufruf von em.close() die Verbindung abgebaut? Aber selbst wenn, sollte das doch keine Probleme machen, da ich mir jedesmal einen neuen EntityManager hole.

Ich schau mir mal die Dokumentation von TopLink etwas genauer an.
 

byte

Top Contributor
Bei Hibernate hast Du direkt gar nicht mit den DB-Connections zu tun. Das passiert alles im Hintergrund. Man arbeitet dort mit (Hibernate) Sessions, die sich selbstständig um die Connections kümmern. Ändert aber auch nichts daran, dass man auch dort einen Connection Pool benutzen muss/ sollte.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben