com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接closures后不允许任何操作

我build立了一个应用程序并部署在本地……并且工作正常。 我将它部署在远程服务器上,并开始获取主题行中提到的exception。 这不是因为有任何防火墙问题。

我改变了我的hibernate.xml连接通过我的IP地址,而不是本地主机,现在我在我的本地部署的应用程序相同的超时。 当我使应用程序运行超过一天时,出现此错误。

自己进行交易或闭幕式后,我没有执行任何操作。 我在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> 

引起:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接closures后,不允许任何操作。连接被驱动程序隐式closures。

详细:

  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 

有没有人有任何想法可能会导致此行为?

编辑:现在我在我的hibernate.cfg.xml文件中使用folloing。它是正确的?

 <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> 

正如@swanliu指出,这是由于一个不好的联系。
但是,在调整服务器时间和客户端超时之前,我会先尝试使用更好的连接池策略。

连接池

Hibernate本身承认其连接池策略是最小的

然而,Hibernate自己的连接池algorithm是相当简单的。 它旨在帮助您开始使用,不适用于生产系统甚至性能testing。 您应该使用第三方池来获得最佳性能和稳定性。 只需将hibernate.connection.pool_size属性replace为特定于连接池的设置即可。 这将closuresHibernate的内部池。 例如,您可能喜欢使用c3p0。
正如参考文献所述 : http : //docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html

我个人使用C3P0 。 但是还有其他的select,包括DBCP
查看

以下是在我的应用程序中使用的C3P0的最小configuration:

 <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 --> 

默认情况下,池永远不会过期连接。 如果希望Connections随着时间的推移而过期以保持“新鲜度”,请设置maxIdleTime和/或maxConnectionAge。 maxIdleTime定义了一个连接应该被允许在被从池中选出之前没有被使用的秒数。 maxConnectionAge强制池清除从数据库中获取的超过设定的秒数的连接。
如参考资料中所述: http //www.mchange.com/projects/c3p0/index.html#managing_pool_size

编辑:
我更新了configuration文件( 参考 ),因为我刚才复制粘贴了我的项目之前。 超时应理想地解决问题,如果这不适合你,有一个昂贵的解决scheme ,我认为你可以看看:

创build一个文件“c3p0.properties”,它必须位于类path的根目录下(即无法为应用程序的特定部分覆盖它)。 ( 参考 )

 # c3p0.properties c3p0.testConnectionOnCheckout=true 

通过这种configuration,每个连接在使用之前都经过testing。 但是,这可能会影响网站的性能。

MySQL隐式closures数据库连接,因为连接已经非活动时间过长 (34247052毫秒≈9.5小时)。 如果您的程序从连接池中获取错误的连接,导致MySQLNonTransientConnectionException: No operations allowed after connection closed

MySQLbuild议:

在应用程序中使用之前,应考虑过期和/或testing连接有效性 ,增加服务器configuration的客户端超时值, 或者使用Connector / J连接属性autoReconnect=true来避免此问题。

如果你不想使用连接池(你确定,你的应用只有一个连接),你可以做到这一点 – 如果连接下降,你必须build立一个新的调用方法.openSession(),而不是.getCurrentSession()

例如:

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

如果你使用Mysql,你可以设置autoReconnect属性:

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

我希望这有帮助。