解决MYSQL 8小时连接问题
之前在使用SSH开发项目的时候遇到了一个很奇怪的问题,部署到服务器上,运行一段时间后系统就崩溃了。
出现错误:org.hibernate.exception.JDBCConnectionException: could not execute query
在后在百度上查了下资料发现了问题所在,原来这个是传说中的8小时问题— —。
一、什么是8小时问题?
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在Hibernate默认连接池中的connections如果空闲超过8小时,Mysql将其断开,而Hibernate默认连接池并不知道该connection已经失效,如果这时有 Client请求connection,Hibernate默认连接池将该失效的Connection提供给Client,将会造成上面的异常。
二、解决的方法
1. 增加 MySQL 的 wait_timeout 属性的值。
修改 /etc/mysql/my.cnf 文件,在 [mysqld] 节中设置:
# Set a connection to wait 8 hours in idle status.
wait_timeout = 86400
86400;
set global wait_timeout=
86400;
相关网络资料:
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。我建议是将这两个参数都修改,以免引起不必要的麻烦。
这两个参数的默认值是8小时(60*60*8=28800)。
测试将这两个参数改为0,结果出人意料,系统自动将这个值设置为28800 。
换句话说,不能将该值设置为永久。
将这2个参数设置为1年(60*60*24*365=31536000)
总不至于一年都不用这个链接吧?
set interactive_timeout=31536000;
set wait_timeout=31536000;
结果:

wait_timeout 的设置出现警告,再看看设置后的结果

也就是说wait_timeout的最大值只允许2147483 (24天左右)
2. 减少连接池内连接的生存周期,使之小于上一项中所设置的 wait_timeout 的值。
修改 c3p0 的配置文件,设置:
# How long to keep unused connections around(in seconds)
# Note: MySQL times out idle connections after
8
hours(28,800 seconds)
# so ensure this value is below MySQL idle timeout
cpool.maxIdleTime=25200
在 Spring 的配置文件中:
- <bean id="dataSource"
- class="com.mchange.v2.c3p0.ComboPooledDataSource">
- <property name="maxIdleTime" value="${cpool.maxIdleTime}" />
- <!-- other properties -->
- </bean>
3. 定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。
c3p0连接池的配置方法:
修改 c3p0 的配置文件,设置:
# Prevent MySQL raise exception after a long idle time

cpool.preferredTestQuery='SELECT 1'

cpool.idleConnectionTestPeriod=18000

cpool.testConnectionOnCheckout=true
修改 Spring 的配置文件:
- <bean id="dataSource"
- class="com.mchange.v2.c3p0.ComboPooledDataSource">
- <property name="preferredTestQuery"
- value="${cpool.preferredTestQuery}" />
- <property name="idleConnectionTestPeriod"
- value="${cpool.idleConnectionTestPeriod}" />
- <property name="testConnectionOnCheckout"
- value="${cpool.testConnectionOnCheckout}" />
- <!-- other properties -->
- </bean>
c3p0连接池的配置方法:
proxool连接池的配置方法:
http://blog.csdn.net/risingsun001/article/details/12197715
注:网上所说的 设置 "autoReconnect=true" 的方法,测试无效,
解决MYSQL 8小时连接问题的更多相关文章
- LNMP一键包安装后解决MySQL无法远程连接问题
MySQL/MariaDB无法远程连接,如何开启? 1,没有给root对应的权限 -- @'192.168.1.123'可以替换为@‘%’就可任意ip访问 mysql> GRANT ALL PR ...
- 解决mysql无法远程连接的问题
前言 最近开发中遇到一个问题,mysql在服务器本地可以登录,但是远程通过3306端口却不可以.这个问题困扰了我一周之久,终于在今天解决了.在解决的过程中试了很多的方法,遂记录下来,希望能给大家一些提 ...
- 解决MySql无法远程连接
安装完MySql后远程通过Navicat访问时报错: ERROR 1130: Host ***.***.***.*** is not allowed to connect to this MySQL ...
- [日常] 解决mysql localhost可以连接但是127.0.0.1不能连接
在测试mysql的过程中遇到使用localhost可以连接但是127.0.0.1不能连接,原因是localhost使用的本地socket连接,127.0.0.1使用使用的tcp连接 在mysql库的u ...
- 解决mysql数据库连接问题
设置mysql远程连接root权限 在远程连接mysql的时候应该都碰到过,root用户无法远程连接mysql,只可以本地连,对外拒绝连接.需要建立一个允许远程登录的数据库帐户,这样才可以进行在远程操 ...
- Linux下mysql的远程连接(转)
转载:http://www.cnblogs.com/fnlingnzb-learner/p/5830661.html 如果Mysql是按上篇的方法进行安装和设置的话,那进行远程连接就会稍微简单一点.我 ...
- 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。
解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...
- mysql默认8小时连接断开机制解决
转载连接:http://www.myexception.cn/database/1639209.html 本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自动断开连接的解决 ...
- 解决mysql默认的8小时自动断开连接
语言:javaEE 框架:spring mvc+spring+mybatis 数据库:mysql8 WEB服务器:tomcat8 背景: 在试运营阶段发现发生“连接超时”异常 抛出异常: Cause: ...
随机推荐
- DOM方式解析XML文件实例
books.XML文件: <?xml version="1.0" encoding="utf-8"?><bookstore> &l ...
- iOS 的一点理解(一) 代理delegate
做了一年的iOS,想记录自己对知识点的一点理解. 第一篇,想记录一下iOS中delegate(委托,也有人称作代理)的理解吧. 故名思议,delegate就是代理的含义, 一件事情自己不方便做,然后交 ...
- 面试题之redis实现限制1小时内每用户Id最多只能登录5次
面试题之redis实现限制1小时内每用户Id最多只能登录5次 /// <summary> /// redis实现限制1小时内每用户Id最多只能登录5次 /// </summary&g ...
- 02_setter注入
工程截图如下 [HelloWorld.java] package com.HigginCui; public class HelloWorld { private String words; publ ...
- Harry Potter
Names appearing in "Harry Potter" 1.Harry Potter ①Harry is from Henry. ②Harry is related t ...
- [GeekBand] C++学习笔记(1)——以复数类为例
本篇笔记以复数类(不含指针的类)为例进行面向对象的学习 ========================================================= 复数类的声明: class ...
- socket通信_笔记
(socket通信) 客户端与服务器端通信问题: 我们首先要了解一个概念性的词汇:Socket socket的英文原义是“孔”或“插座”.作为进程通信机制,取后一种意思.通常也称作“套接字”,用于描述 ...
- debian 学习记录-5
后裔排名 1 Debian - 1292 Fedora - 633 Knoppix - 50 (Knoppix本身是Debian后裔) Debian4 SuSE - 28 Debian,由Ian Mu ...
- 小shell函数
whoport() { port=$1 echo "------ who occupied port: $port ----------" info=$(sudo lsof ...
- 拓展:switch实现
拓展:switch实现 参考中谷教育 python视频:switch switch语句用于编写多分支结构的程序,类似于if ... elif ...else语句.switch语句表达的分支结构比if ...