java - sistema - com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: no se permiten operaciones después de cerrar la conexión
sistema de registro en java netbeans (4)
Creé una aplicación y la implementé localmente ... y funcionó a la perfección. Lo implementé en un servidor remoto y comencé a recibir la excepción mencionada en la línea de asunto. No es por problemas con el firewall.
Cambié mi hibernate.xml
para conectarme a través de mi dirección IP en lugar de localhost y ahora obtengo los mismos tiempos de espera en mi aplicación desplegada localmente. Recibo este error cuando mantengo la aplicación en ejecución por más de un día.
No realizo ninguna operación después de realizar transacciones o cerrar sesiones yo mismo. Estoy usando las siguientes propiedades en 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>
Causado por: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: no se permitieron operaciones después de que se cerró la conexión. La conexión fue implícitamente cerrada por el controlador.
Detallado:
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
¿Alguien tiene alguna idea de lo que podría causar este comportamiento?
EDITAR: ahora estoy usando folloing en mi archivo hibernate.cfg.xml.¿Es correcto?
<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>
Asegúrese de estar utilizando el último conector jdbc según mysql. Estaba enfrentando este problema y cuando reemplacé mi antiguo conector jdbc con el último, el problema fue resuelto.
Puede descargar el último controlador jdbc de https://dev.mysql.com/downloads/connector/j/
Seleccione el sistema operativo como plataforma independiente. Te mostrará dos opciones. Uno como alquitrán y uno como zip. Descargue el archivo zip y extráigalo para obtener el archivo jar y reemplácelo con su conector anterior.
Esto no es solo para hibernate framework, sino que también se puede usar con cualquier plataforma que requiera un conector jdbc.
Como @swanliu señaló que se debe a una mala conexión.
Sin embargo, antes de ajustar el tiempo del servidor y el tiempo de espera del cliente, primero trataría de usar una mejor estrategia de agrupamiento de conexiones.
Agrupación de conexiones
Hibernate admite que su estrategia de agrupación de conexiones es mínima
El algoritmo de agrupación de conexiones propio de Hibernate es, sin embargo, bastante rudimentario. Está destinado a ayudarlo a comenzar y no está previsto para su uso en un sistema de producción o incluso para pruebas de rendimiento. Debe usar un grupo de terceros para obtener el mejor rendimiento y estabilidad. Simplemente reemplace la propiedad hibernate.connection.pool_size con la configuración específica del conjunto de conexiones. Esto desactivará el grupo interno de Hibernate. Por ejemplo, puede usar c3p0.
Como se indica en la Referencia : http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html
Yo personalmente uso C3P0
. Sin embargo, hay otras alternativas disponibles, incluido DBCP
.
Revisa
A continuación se muestra una configuración mínima de C3P0 utilizada en mi aplicación:
<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 -->
De forma predeterminada, las agrupaciones nunca caducarán las conexiones. Si desea que las conexiones expiren a lo largo del tiempo para mantener la "frescura", establezca maxIdleTime y / o maxConnectionAge. maxIdleTime define cuántos segundos se debe permitir que una conexión no se use antes de eliminarse de la agrupación. maxConnectionAge obliga al grupo a eliminar las conexiones que se adquirieron de la base de datos más que el número de segundos establecido en el pasado.
Como se indica en la Referencia: http://www.mchange.com/projects/c3p0/index.html#managing_pool_size
Editar:
Actualicé el archivo de configuración ( Reference ), ya que acababa de copiar pegado el de mi proyecto anteriormente. El tiempo de espera idealmente debería resolver el problema. Si eso no funciona para usted, existe una solución costosa que creo que podría ver:
Cree un archivo "c3p0.properties" que debe estar en la raíz del classpath (es decir, no hay manera de anularlo para partes particulares de la aplicación). ( Reference )
# c3p0.properties
c3p0.testConnectionOnCheckout=true
Con esta configuración, cada conexión se prueba antes de ser utilizada. Sin embargo, podría afectar el rendimiento del sitio.
MySQL cerró implícitamente la conexión de la base de datos porque la conexión ha estado inactiva durante demasiado tiempo (34,247,052 milisegundos ≈ 9,5 horas). Si su programa obtiene una mala conexión del grupo de conexiones que causa la MySQLNonTransientConnectionException: No operations allowed after connection closed
.
MySQL sugiere:
Debe considerar caducar y / o probar la validez de la conexión antes de usarla en su aplicación, aumentar los valores configurados del servidor para los tiempos de espera del cliente o usar la propiedad de conexión Connector / J
autoReconnect=true
para evitar este problema.
Si no desea utilizar el grupo de conexiones (asegúrese de que su aplicación solo tiene una conexión), puede hacer esto: si se produce una conexión, debe establecer uno nuevo; llame al método .openSession () en su lugar .getCurrentSession ()
Por ejemplo:
SessionFactory sf = null;
// get session factory
// ...
//
Session session = null;
try {
session = sessionFactory.getCurrentSession();
} catch (HibernateException ex) {
session = sessionFactory.openSession();
}
Si usa Mysql, puede configurar la propiedad autoReconnect :
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/database?autoReconnect=true</property>
Espero que esto ayude.