web-dev-qa-db-de.com

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Nach dem Schließen der Verbindung sind keine Operationen zulässig

Ich habe eine Anwendung erstellt und lokal implementiert ... und sie funktionierte perfekt. Ich stellte es auf einem Remote-Server bereit und bekam die in der Betreffzeile erwähnte Ausnahme. Es liegt nicht an Firewall-Problemen.

Ich änderte meinen hibernate.xml, um eine Verbindung über meine IP-Adresse anstelle von localhost herzustellen, und jetzt bekomme ich die gleichen Timeouts für meine lokal bereitgestellte Anwendung. Diese Fehlermeldung wird angezeigt, wenn die Anwendung länger als einen Tag ausgeführt wird.

Ich führe keine Operationen durch, nachdem ich Transaktionen abgeschlossen oder selbst Sitzungen geschlossen habe. Ich verwende die folgenden Eigenschaften in hibernate.cfg.xml

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://myremotehost:3306/akp</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>

Verursacht durch: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Nach dem Schließen der Verbindung sind keine Vorgänge zulässig. Die Verbindung wurde vom Treiber implizit geschlossen.

Detailliert:  

 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed by the driver.
      at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
      at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
      at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
      at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
      at com.mysql.jdbc.Util.getInstance(Util.Java:384)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:1015)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:989)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:984)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:929)
      at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.Java:1193)
      at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.Java:1180)
      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.Java:4137)
      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.Java:4103)
      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.Java:505)
      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.Java:423)
      at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.Java:139)
      at org.hibernate.loader.Loader.prepareQueryStatement(Loader.Java:1547)
      at org.hibernate.loader.Loader.doQuery(Loader.Java:673)
      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:236)
      at org.hibernate.loader.Loader.doList(Loader.Java:2220)
      ... 36 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 34,247,052 milliseconds ago.  The last packet sent successfully to the server was 34,247,052 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
      at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
      at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
      at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
      at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
      at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1118)
      at com.mysql.jdbc.MysqlIO.send(MysqlIO.Java:3321)
      at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.Java:1940)
      at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.Java:2113)
      at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.Java:2568)
      at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.Java:2113)
      at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.Java:2275)
      at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.Java:186)
      at org.hibernate.loader.Loader.getResultSet(Loader.Java:1787)
      at org.hibernate.loader.Loader.doQuery(Loader.Java:674)
      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:236)
      at org.hibernate.loader.Loader.doList(Loader.Java:2220)
      at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.Java:2104)
      at org.hibernate.loader.Loader.list(Loader.Java:2099)
      at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.Java:94)
      at org.hibernate.impl.SessionImpl.list(SessionImpl.Java:1569)
      at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.Java:283)
      at com.xyz.abc.DAO.GenericHibernateDAO.findByField(GenericHibernateDAO.Java:119)
      at com.xyz.abc.DAO.JobDAO.getJobsByLdap(JobDAO.Java:115)
      at com.xyz.abc.business.Jcr.getMyruns(Jcr.Java:272)
      at com.xyz.abc.business.abcService.getMyruns(abcService.Java:54)
      at Sun.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
      at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
      at Java.lang.reflect.Method.invoke(Method.Java:597)
      at org.Apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.Java:194)
      at org.Apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.Java:102)
      at org.Apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.Java:40)
      at org.Apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.Java:114)
      at org.Apache.axis2.engine.AxisEngine.receive(AxisEngine.Java:173)
      at org.Apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.Java:173)
      at org.Apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.Java:142)
      at javax.servlet.http.HttpServlet.service(HttpServlet.Java:641)
      at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
      at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:304)
      at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:208)
      at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:240)
      at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:203)
      at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:164)
      at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:108)
      at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
      at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:379)
      at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:242)
      at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:259)
      at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:237)
      ... 4 more
Caused by: Java.net.SocketException: Software caused connection abort: socket write error

Hat jemand eine Idee, was dieses Verhalten verursachen könnte?

EDIT: Jetzt verwende ich folgendes in meiner hibernate.cfg.xml-Datei. Ist das richtig?

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xyz</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.show_sql">false</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
<!-- <property name="hibernate.c3p0.max_size">1800</property>-->
    <property name="hibernate.c3p0.max_statements">50</property>

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="c3p0.max_statements">0</property>
    <property name="c3p0.maxIdleTimeExcessConnections">3600</property>
    <property name="c3p0.idleConnectionTestPeriod">3600</property> 
    <property name="c3p0.maxIdleTime">3600</property>
37
Akshay

Wie @swanliu darauf hinweist, liegt es an einer schlechten Verbindung.
Bevor ich jedoch das Server-Timing und das Client-Timeout angepasst habe, würde ich zunächst versuchen, eine bessere Verbindungspooling-Strategie zu verwenden. 

Verbindungspooling

Hibernate selbst gibt zu, dass seine Verbindungspooling-Strategie minimal ist

Der eigene Verbindungspooling-Algorithmus von Hibernate ist jedoch ziemlich rudimentär. Es soll Ihnen den Einstieg erleichtern und ist nicht bestimmt für den Einsatz in einem Produktionssystem oder sogar für die Leistung testen. Sie sollten einen Pool von Drittanbietern verwenden, um eine optimale Leistung zu erzielen. Stabilität. Ersetzen Sie einfach die Eigenschaft hibernate.connection.pool_size mit verbindungspoolspezifischen einstellungen. Dies deaktiviert Hibernates Innenpool. Beispielsweise möchten Sie c3p0 ..__ verwenden. 
Wie in Referenz: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html angegeben.

Ich persönlich benutze C3P0. Es gibt jedoch auch andere Alternativen, einschließlich DBCP.
Auschecken 

Nachfolgend finden Sie eine Minimalkonfiguration von C3P0, die in meiner Anwendung verwendet wird:

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.acquire_increment">1</property> 
<property name="c3p0.idle_test_period">100</property> <!-- seconds --> 
<property name="c3p0.max_size">100</property> 
<property name="c3p0.max_statements">0</property> 
<property name="c3p0.min_size">10</property> 
<property name="c3p0.timeout">1800</property> <!-- seconds --> 

Standardmäßig laufen Pools niemals Connections ab. Wenn Sie wünschen Verbindungen, die im Laufe der Zeit abgelaufen sein müssen, um die "Frische" zu erhalten, setze maxIdleTime und/oder maxConnectionAge. maxIdleTime definiert, wie viele Sekunden sollte eine Verbindung ungenutzt bleiben, bevor aus dem Pool ausgespuckt. maxConnectionAge zwingt den Pool, beliebige .__ zu löschen. Verbindungen, die von der Datenbank mehr als von der Gruppe erworben wurden Anzahl Sekunden in der Vergangenheit . 
Wie in Referenz angegeben:http://www.mchange.com/projects/c3p0/index.html#managing_pool_size

Bearbeiten:
Ich habe die Konfigurationsdatei ( Reference ) aktualisiert, da ich gerade die zuvor für mein Projekt eingefügte Datei kopiert hatte . Das Timeout sollte das Problem idealerweise lösen eine teure lösung, von der ich denke, dass sie sie sich ansehen könnte:

Erstellen Sie eine Datei "c3p0.properties", die sich im Stammverzeichnis des Klassenpfads befinden muss (d. H. Keine Möglichkeit, ihn für bestimmte Teile der Anwendung zu überschreiben). ( Referenz )

# c3p0.properties
c3p0.testConnectionOnCheckout=true

Bei dieser Konfiguration wird jede Verbindung getestet, bevor sie verwendet wird. Dies kann jedoch die Leistung der Website beeinträchtigen.

20

MySQL hat die Datenbankverbindung implizit geschlossen, weil die Verbindung zu lange inaktiv (34,247,052 Millisekunden ≈ 9,5 Stunden) war. Wenn Ihr Programm dann eine schlechte Verbindung aus dem Verbindungspool abruft, die den MySQLNonTransientConnectionException: No operations allowed after connection closed verursacht.

MySQL schlägt vor:

Sie sollten entweder das Ablaufen und/oder Testen der Verbindungsgültigkeit in Betracht ziehen, bevor Sie in Ihrer Anwendung verwendet werden. Erhöhen Sie die vom Server konfigurierten Werte für Client-Zeitüberschreitungen. oder verwenden Sie die Connector/J-Verbindungseigenschaft autoReconnect=true. um dieses Problem zu vermeiden.

17
swanliu

Wenn Sie keinen Verbindungspool verwenden möchten (Sie sind sicher, dass Ihre App nur eine Verbindung hat), können Sie dies tun - wenn die Verbindung unterbrochen wird, müssen Sie eine neue Ein-Aufruf-Methode .openSession () anstatt einrichten. getCurrentSession ()  

Zum Beispiel:

SessionFactory sf = null;
// get session factory
// ...
//
Session session = null;
try {
        session = sessionFactory.getCurrentSession();
} catch (HibernateException ex) {
        session = sessionFactory.openSession();
}

Wenn Sie Mysql verwenden, können Sie autoReconnect property einstellen:

    <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/database?autoReconnect=true</property>

Ich hoffe das hilft.

1

Vergewissern Sie sich, dass Sie den neuesten Jdbc-Connector gemäß MySQL verwenden. Ich war mit diesem Problem konfrontiert und als ich meinen alten Jdbc-Connector durch den neuesten ersetzt habe, wurde das Problem gelöst.

Sie können den neuesten jdbc-Treiber von https://dev.mysql.com/downloads/connector/j/ - herunterladen. 

Wählen Sie Betriebssystem als plattformunabhängig aus. Es werden Ihnen zwei Optionen angezeigt. Einer als Teer und einer als Zip. Laden Sie die Zip-Datei herunter und extrahieren Sie sie, um die JAR-Datei zu erhalten, und ersetzen Sie sie durch Ihren alten Connector. 

Dies ist nicht nur für das Hibernate-Framework, es kann mit jeder Plattform verwendet werden, für die ein Jdbc-Connector erforderlich ist.

0
Gurbaksh Singh
  1. Ersetzen Sie zuerst die MySQL-Abhängigkeit wie unten angegeben

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-Java</artifactId>
        <version>5.1.44</version>
    </dependency>
    
  2. Es wird ein Fehler angezeigt, der "Authentifizierungs-Plugin 'caching_sha2_password'" anzeigt. Führen Sie diesen Befehl aus: 

    mysql -u root -p
    ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
    
0
Karan