mysql连接超过8小时错误_mysql超过8小时数据库断掉连接的简单解决办法
應用程序和數據庫建立連接,如果超過8小時應用程序不去訪問數據庫,數據庫就斷掉連接?。這時再次訪問就會拋出異常,如下所示:
java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
...
查了一下發現應用程序和mysql數據庫建立連接,如果超過8小時應用程序不去訪問數據庫,數據庫就斷掉連接 。這時再次訪問就會拋出異常。
關于mysql自動斷開的問題研究結果如下,在mysql中有相關參數設定,當數據庫連接空閑一定時間后,服務器就會斷開等待超時的連接:
1、相關參數,紅色部分
mysql> show variables like '%timeout%';
+--------------------------+-------+
| Variable_name??????????? | Value |
+--------------------------+-------+
| connect_timeout????????? | 5???? |
| delayed_insert_timeout?? | 300?? |
| innodb_lock_wait_timeout | 50??? |
| interactive_timeout????? | 28800 |
| net_read_timeout???????? | 30??? |
| net_write_timeout??????? | 60??? |
| slave_net_timeout??????? | 3600 |
| wait_timeout???????????? | 28800 |
+--------------------------+-------+
同一時間,這兩個參數只有一個起作用。到底是哪個參數起作用,和用戶連接時指定的連接參數相關,缺省情況下是使用wait_timeout。我建議是將這兩個參數都修改,以免引起不必要的麻煩。
2、修改參數
這兩個參數的默認值是8小時(60*60*8=28800)。我測試過將這兩個參數改為0,結果出人意料,系統自動將這個值設置為1。換句話說,不能將該值設置為永久。
將這2個參數設置為24小時(60*60*24=604800)即可。
set interactive_timeout=604800;
set wait_timeout=604800;
也可以修改my.cof,修改后重起mysql
打開/etc/my.cnf,在屬性組mysqld下面添加參數如下:
[mysqld]
interactive_timeout=28800000
wait_timeout=28800000
如果一段時間內沒有數據庫訪問則mysql自身將切斷連接,之后訪問java訪問連接池時對數據庫的數據通道早就關閉了,因為dbcp連接池無法時時維護與數據庫的連接關系,mysql5以后即使在dbcp配置中加入autoReconnect=true也沒有效果。
其實愚蠢的版本就是直接加大這兩個值
正確的解決方法是使用開源的proxool來取代tomcat的dbcp連接池
2、解壓縮proxool-0.9.0RC3.zip,拷貝lib下的所有jar庫文件到你的工程下的WEB-INF/lib下,同時記得也把Mysql的jdbc驅動到web-info/lib
3、在WEB-INF下(別跑錯地方)建立文件:proxool.xml
proxool.xml這個文件是用來設置別名的。
其中標簽就是別名的設置段。
alias是別名;
driver-url是驅動的url,就是連接的url;
driver-class是驅動的類,就是數據庫驅動;
driver-properties是驅動的屬性,可以設置登陸數據庫的用戶名和密碼。maximum-connection-count是最大連接數;
house-keeping-sleep-time是proxool自動偵察各個連接狀態的時間間隔(毫秒)屬性,偵察到空閑的連接就馬上回收,超時的銷毀;
house-keeping-test-sql是proxool自動偵察各個連接狀態是用的sql。
文件內容如下:
crm
jdbc:mysql://127.0.0.1:3306/crm?useUnicode=true&autoReconnect=true&characterEncoding=GBK
com.mysql.jdbc.Driver
25
5
60000
select 1
4、在WEB-INF/web.xml中節點里加入如下內容:
proxoolServletConfigurator
org.logicalcobwebs.proxool.configuration.ServletConfigurator
xmlFile
WEB-INF/proxool.xml
1
Admin
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
Admin
/admin
5、在需要連接數據庫時,只需要寫:
Connection conn = DriverManager.getConnection("proxool.DBPool");
總結
以上是生活随笔為你收集整理的mysql连接超过8小时错误_mysql超过8小时数据库断掉连接的简单解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql多源复制脚本_Mysql多源复
- 下一篇: java pdf添加图片_java实现在