MySql数据库如果超过8小时处于空闲状态,则会自动断开连接,报连接超时错误,错误代码如下:
java.net.SocketException
MESSAGE: Broken pipe
STACKTRACE:
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2637)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1554)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3176)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1153)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1266)
如果使用hibernate自带的连接池则极易出现此问题,上网翻阅了大量的资料,现总结出解决此问题的几种方法:
(1)修改mysql的my.ini文件,增加如下配置:
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306
# added from now
socket = /tmp/mysql.sock
# 单位是秒,相当于24小时,原来默认为28800即8小时
wait_timeout=86400
interactive_timeout = 86400
# added end
(2)改用proxool连接池方法:
配置proxool.xml文件内容如下:
testDB
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK&autoReconnect=true&zeroDateTimeBehavior=convertToNull
com.mysql.jdbc.Driver
900000
select CURRENT_DATE
20
5
100
10
配置hibernate.cfg.xml文件内容如下:
/p>
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
org.hibernate.connection.ProxoolConnectionProvider
testDB
proxool.xml
org.hibernate.dialect.MySQLDialect
true
java类中的调用方式如下:
Class.forName("org.hibernate.connection.ProxoolConnectionProvider");
Connection con = DriverManager.getConnection("proxool.testDB");
用完连接后,记得释放就可以了。
当然还有其它连接池的配置方式,方法大致相同,就不在此一一列举。
分享到:
2009-05-20 13:47
浏览 1536
评论