2016-03-27 17 views
0

Ich habe eine Java-Anwendung mit Hibernate. Ich implementiere es einfach c3p0. Aperentemente funktioniert alles erstmal (sobald ich den Tomcat Server in unserem Host neu starte). Aber bald nach ein paar Kundenzugriff, passiert es nicht mehr Sitzungen für die Interaktion mit unserer BD Mysql zu erstellen. Kann mir jemand dabei helfen? Ich werde dankbar sein.Verbindung Pooling Hibernate

folgenden Codes:

hibernate.cfg.xml:

<property name="hibernate.connection.provider_class"> 
org.hibernate.connection.C3P0ConnectionProvider 
</property> 
<property name="hibernate.c3p0.min_size">7</property> 
<property name="hibernate.c3p0.max_size">53</property> 
<property name="hibernate.c3p0.timeout">100</property> 
<property name="hibernate.c3p0.max_statements">50</property> 
<property name="hibernate.c3p0.idle_test_period">1000</property> 
<property name="hibernate.c3p0.validate">true</property> 

HibernateUtil.java:

public final class HibernateUtil{ 
    private static SessionFactory sessionFactory; 
     public static SessionFactory getSessionFactory() throws MappingException 
     { 
      if(sessionFactory == null) { 
       //sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 
       sessionFactory = new Configuration().configure().buildSessionFactory(); 
      } 
      return sessionFactory; 
     } 

     public static Session openSession() 
     { 
      return getSessionFactory().openSession(); 
     } 

} 

CidadesDao.java:

import java.math.BigInteger; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import org.hibernate.Criteria; 
import org.hibernate.HibernateException; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 
import org.hibernate.criterion.Restrictions; 
import org.hibernate.transform.Transformers; 
import org.hibernate.type.StandardBasicTypes; 
import ConnectionHibernate.ConnectionHibernate; 
import ConnectionHibernate.HibernateUtil; 
import br.com.cuponero.bean.Cidades; 

public class CidadesDao { 
    private static final String TABLE = "Cidades"; 
    Session session; 

    public CidadesDao() { 
     this.session = HibernateUtil.getSessionFactory().openSession(); 
     this.session.beginTransaction(); 
    } 

    /** 
    * Select todos 
    * @return 
    **/ 
    public List<Cidades> getTodos(){ 
      List<Cidades> lCit = null; 

      try{ 
      Query q = session.createSQLQuery("SELECT * FROM "+TABLE) 
        .addScalar("id", StandardBasicTypes.BIG_INTEGER) 
        .addScalar("nome", StandardBasicTypes.STRING) 
        .addScalar("ddd", StandardBasicTypes.STRING) 
        .addScalar("estaoId", StandardBasicTypes.INTEGER) 
        .addScalar("ativo", StandardBasicTypes.INTEGER) 

        .setResultTransformer(Transformers.aliasToBean(Cidades.class)); 
      //System.out.println("list 0: "+q.list().get(0)); 

      lCit = q.list(); 
      //tx.commit(); 

      }catch (HibernateException e) { 
      if (session!=null) session.beginTransaction().rollback(); 
      e.printStackTrace(); 
      }finally{ 
       //closeMyConnection(); 
       //mySessionClose(); 

       session.beginTransaction().commit(); 
      } 

      return lCit; 
    } 

...

nach dem LOG diese Web Service:

27. März 2016 16.30.32 com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask laufen advertencia: co[email protected]172ea03 - Übernahmeversuch fehlgeschlagen !!! Ausstehende Löschung erwirbt. Beim Versuch, eine benötigte neue Ressource zu erhalten, ist es uns nicht gelungen, mehr als die maximal zulässige Anzahl von Zugriffsversuchen zu erreichen (30). Letzte Erwerb Versuch Ausnahme: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: User cupone_plinhares hat bereits mehr als 'max_user_connections' aktive Verbindungen bei sun.reflect.GeneratedConstructorAccessor28.newInstance (Unknown Source) bei sun.reflect.DelegatingConstructorAccessorImpl. newInstance (DelegatingConstructorAccessorImpl.java:45) bei java.lang.reflect.Constructor.newInstance (Constructor.java:422) bei com.mysql.jdbc.Util.handleNewInstance (Util.java:404) bei com.mysql. jdbc.Util.getInstance (Util.java:387) bei com.mysql.jdbc.SQLError.createSQLException (SQLError.java:941) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3870) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (Meine sqlIO.java:3806) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:871) bei com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication (MysqlIO.java:1686) bei com.mysql.jdbc. MysqlIO.doHandshake (MysqlIO.java:1207) bei com.mysql.jdbc.ConnectionImpl.coreConnect (ConnectionImpl.java:2254) bei com.mysql.jdbc.ConnectionImpl.connectOneTryOnly (ConnectionImpl.java:2285) bei com. mysql.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:2084) bei com.mysql.jdbc.ConnectionImpl. (ConnectionImpl.java:795) bei com.mysql.jdbc.JDBC4Connection. (JDBC4Connection.java:44) bei sun.reflect.GeneratedConstructorAccessor23.newInstance (Unbekannte Quelle) bei sun.reflect.DelegatingConstruct orAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) bei java.lang.reflect.Constructor.newInstance (Constructor.java:422) bei com.mysql.jdbc.Util.handleNewInstance (Util.java:404) bei com. mysql.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:400) bei com.mysql.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:327) bei com.mchange.v2.c3p0.DriverManagerDataSource.getConnection (DriverManagerDataSource.java: 146) bei com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:195) bei com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:184) bei com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool 1 $ PooledConnectionResourcePoolManager.acquireResource (C3P0PooledConnectionPool.java:200) bei com.mchange.v2.resourcepool.BasicResourcePool.doAcquire (BasicResourcePool.java:1086) bei com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess (BasicResourcePool.java:1073) bei com.mchange.v2.resourcepool.BasicResourcePool.access $ 800 (BasicResourcePool.java:44) bei com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask.run (BasicResourcePool.java:1810) bei com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run (ThreadPoolAsynchronousRunner.java:648)

27. März 2016 04.30.32 com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask laufen advertencia : com[email protected]3ba80 - Übernahmeversuch fehlgeschlagen !!! Ausstehende Löschung erwirbt. Beim Versuch, eine benötigte neue Ressource zu erhalten, ist es uns nicht gelungen, mehr als die maximal zulässige Anzahl von Zugriffsversuchen zu erreichen (30). Letzte Erwerb Versuch Ausnahme: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: User cupone_plinhares hat bereits mehr als 'max_user_connections' aktive Verbindungen bei sun.reflect.GeneratedConstructorAccessor28.newInstance (Unknown Source) bei sun.reflect.DelegatingConstructorAccessorImpl. newInstance (DelegatingConstructorAccessorImpl.java:45) bei java.lang.reflect.Constructor.newInstance (Constructor.java:422) bei com.mysql.jdbc.Util.handleNewInstance (Util.java:404) bei com.mysql. jdbc.Util.getInstance (Util.java:387) bei com.mysql.jdbc.SQLError.createSQLException (SQLError.java:941) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3870) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (Meine sqlIO.java:3806) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:871) bei com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication (MysqlIO.java:1686) bei com.mysql.jdbc. MysqlIO.doHandshake (MysqlIO.java:1207) bei com.mysql.jdbc.ConnectionImpl.coreConnect (ConnectionImpl.java:2254) bei com.mysql.jdbc.ConnectionImpl.connectOneTryOnly (ConnectionImpl.java:2285) bei com. mysql.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:2084) bei com.mysql.jdbc.ConnectionImpl. (ConnectionImpl.java:795) bei com.mysql.jdbc.JDBC4Connection. (JDBC4Connection.java:44) bei sun.reflect.GeneratedConstructorAccessor23.newInstance (Unbekannte Quelle) bei sun.reflect.DelegatingConstruct orAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) bei java.lang.reflect.Constructor.newInstance (Constructor.java:422) bei com.mysql.jdbc.Util.handleNewInstance (Util.java:404) bei com. mysql.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:400) bei com.mysql.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:327) bei com.mchange.v2.c3p0.DriverManagerDataSource.getConnection (DriverManagerDataSource.java: 146) bei com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:195) bei com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:184) bei com.mchange.v2. c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnec tionResourcePoolManager.acquireResource (C3P0PooledConnectionPool.java:200) bei com.mchange.v2.resourcepool.BasicResourcePool.doAcquire (BasicResourcePool.java:1086) bei com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess (BasicResourcePool.java: 1073) bei com.mchange.v2.resourcepool.BasicResourcePool.access $ 800 (BasicResourcePool.java:44) bei com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask.run (BasicResourcePool.java:1810) bei com .mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run (ThreadPoolAsynchronousRunner.java:648)

27. März 2016 04.30.32 com.mchange.v2.resourcepool.BasicResourcePool forceKillAcquires advertencia: gescheitert erwerben Eine Ressource, [email protected] unterbricht alle Threads, die darauf warten, dass eine Ressource ausgeht. Wird als Reaktion auf neue Clientanforderungen erneut versuchen. mar 27, 2016 4:30:32 PM com.change.v2.resourcepool.BasicResourcePool forceKillAcquires ADVERTÊNCIA: Nachdem eine Ressource nicht gefunden wurde, unterbricht [email protected] alle Threads, die auf eine Ressource warten überprüfen. Wird als Reaktion auf neue Clientanforderungen erneut versuchen. 27.03.2016 16:30:32 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL-Fehler: 0, SQLState: null 27.03.2016 04:30:32 org.hibernate.engine .jdbc.spi.SqlExceptionHelper logExceptions Fehler: Verbindungen konnten nicht von der zugrunde liegenden Datenbank erworben werden! 27. März 2016 4:30:32 PM com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask ausführen ADVERTÊNCIA: com[email protected]2386af - Übernahmeversuch fehlgeschlagen !!! Ausstehende Löschung erwirbt. Beim Versuch, eine benötigte neue Ressource zu erhalten, ist es uns nicht gelungen, mehr als die maximal zulässige Anzahl von Zugriffsversuchen zu erreichen (30). Letzte Erwerb Versuch Ausnahme: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: User cupone_plinhares hat bereits mehr als 'max_user_connections' aktive Verbindungen bei sun.reflect.GeneratedConstructorAccessor28.newInstance (Unknown Source) bei sun.reflect.DelegatingConstructorAccessorImpl. newInstance (DelegatingConstructorAccessorImpl.java:45) bei java.lang.reflect.Constructor.newInstance (Constructor.java:422) bei com.mysql.jdbc.Util.handleNewInstance (Util.java:404) bei com.mysql. jdbc.Util.getInstance (Util.java:387) bei com.mysql.jdbc.SQLError.createSQLException (SQLError.java:941) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3870) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (Meine sqlIO.java:3806) bei com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:871) bei com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication (MysqlIO.java:1686) bei com.mysql.jdbc. MysqlIO.doHandshake (MysqlIO.java:1207) bei com.mysql.jdbc.ConnectionImpl.coreConnect (ConnectionImpl.java:2254) bei com.mysql.jdbc.ConnectionImpl.connectOneTryOnly (ConnectionImpl.java:2285) bei com. mysql.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:2084) bei com.mysql.jdbc.ConnectionImpl. (ConnectionImpl.java:795) bei com.mysql.jdbc.JDBC4Connection. (JDBC4Connection.java:44) bei sun.reflect.GeneratedConstructorAccessor23.newInstance (Unbekannte Quelle) bei sun.reflect.DelegatingConstruct orAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) bei java.lang.reflect.Constructor.newInstance (Constructor.java:422) bei com.mysql.jdbc.Util.handleNewInstance (Util.java:404) bei com. mysql.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:400) bei com.mysql.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:327) bei com.mchange.v2.c3p0.DriverManagerDataSource.getConnection (DriverManagerDataSource.java: 146) bei com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:195) bei com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java: 184) bei com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnectionResourcePoolManager.acquireResource (C3P0PooledConnectionPool.java:200) bei com.mchange.v2.resourcepool.BasicResourcePool.doAcquire (BasicResourcePool.java:1086) bei com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess (BasicResourcePool.java:1073) bei com.mchange.v2.resourcepool.BasicResourcePool.access $ 800 (BasicResourcePool.java:44) bei com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask.run (BasicResourcePool.java:1810) bei com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run (ThreadPoolAsynchronousRunner.java:648)

Für eine beste Hilfe, die Log-in Android Studio der meine Anwendung Nach wenn ich versucht, die diesen Web-Service-UP zu verbinden:

org.hibernate.exception.internal.StandardSQLExceptionConverter.convert (StandardSQLExceptionConverter.java:47) org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:109) org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:95) org.hibernate.resource.jdbc .internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded (LogicalConnectionManagedImpl.java:90) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection (LogicalConnectionManaged Impl.java:112) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement (LogicalConnectionManagedImpl.java:230) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin (LogicalConnectionManagedImpl.java:237) org .hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.begin (JdbcResourceLocalTransactionCoordinatorImpl.java:213) org.hibernate.engine.transaction.internal.TransactionImpl.begin (TransactionImpl.java:52) org.hibernate .internal.SessionImpl.beginTransaction (SessionImpl.java:1454) br.com.cuponero.dao.CidadesDao. <init> (CidadesDao.java:31) br.com.cuponero.actionsDaServlet.CidadesActionDaServlet.getJsonRegiao (CidadesActionDaServlet.java:35) br.com.cuponero.servlet.CidadesServlet.doPost (CidadesServlet.java:69) javax .servlet.http.HttpServlet.service (HttpServlet.java:650) javax.servlet.http.HttpServlet.service (HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java : 52)

Ursache java.sql.SQLException: Verbindungen nicht von der zugrunde liegenden Datenbank erfasst werden konnte! com.mchange.v2.sql.SqlUtils.toSQLException (SqlUtils.java:118) com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection (C3P0PooledConnectionPool.java:689) com.mchange.v2.c3p0.impl .AbstractPoolBackedDataSource.getConnection (AbstractPoolBackedDataSource.java:140) org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection (C3P0ConnectionProvider.java:73) org.hibernate.internal.AbstractSessionImpl $ NonContextualJdbcConnectionAccess.obtainConnection (AbstractSessionImpl.java:382) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded (LogicalConnectionManagedImpl.java:87) org.hibernate.resource.jdbc.internal.LogicalConnectionM anagedImpl.getPhysicalConnection (LogicalConnectionManagedImpl.java:112) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement (LogicalConnectionManagedImpl.java:230) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin (LogicalConnectionManagedImpl.java:237) org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.begin (JdbcResourceLocalTransactionCoordinatorImpl.java:213) org.hibernate.engine.

sehen Sie, dass diese Protokollzeile sagt sie das Problem ist hier: br.com.cuponero.dao.CidadesDao. & lt; init & gt; (CidadesDao.java:31) was hat diese Zeile ist dieser Code:

this.session.beginTransaction();

+0

Fragen: Wie viele Instanzen von CidadesDao haben Sie? Ist es ein Singleton? Wie viele DAOs gibt es noch, die sich mit der Datenbank verbinden? Warum verwenden Sie eine Sitzung im DAO-Konstruktor - tun Sie das in all Ihren DAOs? –

+0

Also habe ich 4 weitere Klassen dao ähnlich, und sie haben auch die gleiche Logik, diese Sitzungen zu instanziieren. Was ist dein Vorschlag ? –

+0

Es wird vorgeschlagen, eine Sitzung in der Methode zu erstellen und sie nicht als Elementvariable beizubehalten, wie dies von Steve vorgeschlagen wurde. Ich fragte nach Klassen und Instanzen, weil ich wissen wollte, warum die Verbindungen erschöpft waren. Wenn jede Instanz eine Verbindung aus dem Pool verwendet und sie nicht zurückgibt, werden sie erschöpft. Ich wollte eine Vorstellung von der Zählung bekommen. –

Antwort

1

Das ist also direkt von Ihrem Stack-Traces:

User cupone_plinhares already has more than 'max_user_connections' active connections

Eine offensichtliche Sache ist cupone_plinhares für Benutzer increasemax_user_connection zu versuchen.

Bevor ich Ihre Stack-Spuren betrachtete, dachte ich, dass das Problem ein Connection-Leck sein würde. Ihr DAO erstellt eine Hibernate-Sitzung als eine Membervariable in seinem Konstruktor, und nichts scheint es zu schließen. Auch Ihr Transaktionsmanagement sieht zweifelhaft aus.

Eine bessere Idee wäre NICHT session als Member-Variable überhaupt zu haben, aber auf Standardfehler etwas zu haben, wie

Session session = null; 
Transaction txn = null; 
try { 
    session = HibernateUtil.getSessionFactory().openSession(); 
    txn = session.beginTransaction(); 

    //do important stuff here 

    txn.commit() 
} catch (Exception e) { 
    try { if (txn != null) txn.rollback() } 
    catch (HibernateException he) { 
    he.printStackTrace(); 
    e.addSuppressed(he); 
    throw e; 
    } 
} finally { 
    try { if (session != null) session.close() } 
    catch (SQLException sqle) { sqle.printStackTrace(); } 
} 

Sie können Dinge melden Sie sich anders als das Drucken oder andere Entscheidungen treffen, um die Ausnahme zu propagieren, wenn txn.rollback() fehlschlägt. Sie müssen jedoch eine konsistente Transaktion starten/commit/rollback, und Sie sollten Sitzungen nach Bedarf erstellen und sie umgehend zerstören, anstatt sie in einer Mitgliedsvariablen offen zu halten, deren Lebenszyklus nicht eindeutig ist.

Der Zweck eines Connection-Pools ist es, die Session-Erstellung günstig zu gestalten, damit Sie sich nicht mit der Komplexität der Verwaltung einer persistenten Sitzung befassen müssen.

+0

Ich werde dann mit einer Instanz von Transition anstelle von Session testen, wie ich es tue. Aber eine Sache, die mein Problem gelöst hat, war zum Teil das Session Dao nach dem Drucken des Bildschirms irgendwelche Ergebnisse von der Bank zu schließen. ... out.print ("Ergebnis der Bank"); myInstanceDao.closeMySessions(); Und hier in meiner Methode I: öffentliche void closeMySessions() { session.beginTransaction() commit().; session.close(); } Aber meine Anwendung verbraucht immer noch eine Menge Speicher, und ich glaube, dass es etwas damit zu tun hat. Wer kann da weiter helfen, danke ok. –