mysql 连接关闭问题和解决方式
来源:互联网 发布:长者风靡网络 编辑:程序博客网 时间:2024/05/18 00:31
spring + hibernate +mysql
遇到一个异常
Caused by: org.hibernate.TransactionException: JDBC begin transaction failed:at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:76)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1396)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:387)
... 16 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
at com.mysql.jdbc.Util.getInstance(Util.java:360)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1232)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1225)
at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4801)
at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:371)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:328)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:72)
... 19 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 53,005,486 milliseconds ago. The last packet sent successfully to the server was 53,005,486 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:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1036)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3661)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2417)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2526)
at com.mysql.jdbc.ConnectionImpl.setReadOnlyInternal(ConnectionImpl.java:4987)
at com.mysql.jdbc.ConnectionImpl.setReadOnly(ConnectionImpl.java:4980)
at org.apache.commons.dbcp.DelegatingConnection.setReadOnly(DelegatingConnection.java:377)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setReadOnly(PoolingDataSource.java:338)
at sun.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:138)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at $Proxy18.setReadOnly(Unknown Source)
at org.springframework.jdbc.datasource.DataSourceUtils.prepareConnectionForTransaction(DataSourceUtils.java:155)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:343)
... 16 more
Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3643)
分析原因是使用连接池中的连接在使用前就已经被关闭。
关闭的原因是mysql默认对超过8小时未使用的连接会关闭。
有两种处理方式,一种是修改mysql中的my.ini 将8小时的时长改长。但这种方式治标不治本,如果线程池中线程很多,还是有可能在超过了过期时间的前未被调用的可能。
这边推荐另外一种方法:
在 spring的datasource中将一下功能打开,将会在使用连接前进行测试。如果连接已经过期,会废弃。
另外还定时对连接池中的里进行可用性检测。
<property name="testOnBorrow" value="true"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnReturn" value="true"/>
<property name="validationQuery" value="${jdbc.validationQuery}"/>
0 0
- mysql 连接关闭问题和解决方式
- MySQL连接超时关闭问题
- 解决mysql 连接问题
- Mysql连接、启动和关闭
- 连接远程服务器上的mysql会出现的问题和解决方式(账号设置等操作)
- SSH session连接关闭问题的解决
- SSH session连接关闭问题的解决
- 命令方式启动和关闭Mysql数据库服务及客户端连接
- 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。
- mysql无法连接,登录,关闭等问题
- nodejs解决mysql和连接池(pool)自动断开问题
- 解决mysql远程连接问题
- 解决MYSQL连接慢问题
- 【解决】mysql 全连接问题
- MySQL数据库的连接和关闭
- PowerDesigner连接MySQL失败的解决方式
- Appserv连接Mysql失败解决方式
- MySQL数据连接,关闭,还有设置数据库的编码方式
- apache commons 之 DbUtils QueryRunner使用之迷雾重重
- PKU OJ 类
- LeetCode 026. Remove Duplicates from Sorted Array
- iOS 之CABasicAnimation简单动画 组动画 顺序播放动画
- Android中webview和js之间的交互
- mysql 连接关闭问题和解决方式
- 撰写架构设计文档的心得体会
- 编程过程中易犯的低级错误(有收获)
- apache commons 之 DbUtils的具体使用以及源代码
- Cassandra数据模型
- 矩阵 的相关知识
- sgu-203 Hyperhuffman
- iOS 之UIApplication的OpenURL简介
- 黑苹果安装及相关注意事项之四,开始折腾之准备工作及设置