`
kc_ren
  • 浏览: 61121 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL5数据库连接超时

阅读更多
系统发布以后,出现了一个奇怪的现象,待机一晚上后,第二天早上第一次登录总是失败。重启Tomcat 服务器后,虽然当天可以正常使用,但是到第二天问题依旧。

引用
…………………………………
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: JDBC rollback failed org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
…………………………….
root cause
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
…………………………
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.


从上面的错误我们可以看出Connection.close(),数据库连接关闭了。为什么之前的系统中我们没有发现过这样的错误呢?我们从数据库连接开始排查:
查看 Hibernate 配置文件:

<property name="connection.username">root</property>
		<property name="connection.password"></property>

		<!-- JDBC connection pool (use the built-in one) -->
		<property name="connection.pool_size">20</property>

		<!-- Enable Hibernate's automatic session context management -->
		<property name="current_session_context_class">thread</property>


在系统中我们使用了数据库连接池来提高数据库的性能。猜测可能是连接池引发的数据库连接问题。顺着这个思路,通过查阅相关得知和MySQL的运行超时有关。
在MySQL Command Line Client中执行show global variables like 'wait_timeout'



我们发现MySQL5将其连接的等待时间(wait_timeout)缺省为28800 seconds,也就是8小时。在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,如果没有数据库操作,MySQL5就将该连接关闭。这时,应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。这解释了为什么程序第二天不能登录的问题。

为了解决这个问题,对于MySQL5之前的版本,如Mysql4.x,只需要修改连接池配置中的URL,添加一个参数:autoReconnect=true,如果是MySQL5及以后的版本,则需要修改my.ini文件。
查看mysql5的手册,发现对wait_timeout的最大值分别是24天/365天(windows/linux)。我们使用的Windows系统,假设我们要将其设为21天,我们只要修改mysql5的配置文件“my.ini”中的[mysqld]后面添加上: wait_timeout=1814400
重新启动mysql5。

就部署而言每次修改my.ini比较麻烦,怎么才能比较好的解决这个问题呢?由于MySQL自动关闭已打开的连接,如果这时有请求(需要执行读写数据库的操作),连接池就用一个连接去操作数据库,而这个连接在Mysql的连接中并不存在,所以会出现以上的异常。如果一个连接在和Mysql建立连接时能检查就不会有这样的问题了。
网络搜索一番发现了一个开源的数据库连接池proxool,它有两个属性:一个是test-before-use,还有一个是test-after-use,这两个属性就是在使用前和使用后都要进行对连接的检查,如果连接无效就扔掉再创建一个新的连接。

在系统不断升级的过程中,我们常常引入一些新技术,这些技术可能会在某些细节上引发其他技术的问题。MySQL5数据连接超时就是一个很好的例子,这就需要我们不断深入,探索这些技术,对于问题的排查也要从新技术的细节入手。
  • 大小: 2.5 KB
分享到:
评论
4 楼 zjfshowtime 2012-10-29  
学习了!
3 楼 kc_ren 2010-05-16  
wangacidlemon 写道
I met the same problem today. Your essay is useful thanks.
But no need to modifiy my.ini, just use mysql command can resolve it:
set global wait_timeout=1728000;


使用命令 重启服务的时候 会恢复
2 楼 programmer365 2010-03-24  
我也遇到了类似的问题,我没有使用连接池。hiberante通过threadlocal来维护session,每次业务开始都创建session,业务结束关闭session。也就是说session相关联的connection不会有超过8小时的可能性。但是系统运行一段时间后也发生了同样的异常,暂想不出合理的解释。根据楼主的描述“待机一晚上后,第二天早上第一次登录总是失败”,难道楼主的系统只创建一个Connection长连接?系统的业务只要频繁操作数据库连接池的话,数据库连接池中的连接理论上都不会长时间处于sleep状态。
1 楼 wangacidlemon 2009-12-11  
I met the same problem today. Your essay is useful thanks.
But no need to modifiy my.ini, just use mysql command can resolve it:
set global wait_timeout=1728000;

相关推荐

    解决MySQL 5数据库连接超时问题

    mysql5将其连接的等待时间(wait_timeout)缺省为8小时。怎么不让它超时呢

    MySQL数据库连接超时(Wait_timeout)问题总结.pdf

    MySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时...

    nodejs 关于mysql模块 连接超时自动断开解决方法

    nodejs 关于mysql模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分

    Qt 多线程连接数据库——数据库连接池

    * 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...

    qt中mysql超时自动断开连解决方案.txt

    可以直接通过设置来达到重连问题,方法很简单,里面有复现自动断开连接导致不能正常插入数据的方法,是自己没有积分所以才要积分

    连接池管理连接oracle数据库

    这是用连接池技术管理连接oracle数据库的工具类代码,如果想连接MySQL,直接修改配置文件即可。

    数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术

    数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术。它的主要目的是提高数据库连接的重用性和性能。在传统的数据库连接方式中,每次与数据库建立连接时都需要进行一系列的网络通信...

    MySQL数据库:Navicat连接和管理数据库.pptx

    数据库和表的创建和管理;;1.MySQL Workbench MySQL官方的一个图形管理工具,支持数据库的创建、设计、迁移、备份、导出、导入等功能,支持windows、linux、mac主流的操作...Navicat创建、修改和删除MySQL数据库;谢谢

    spring boot配置MySQL数据库连接、Hikari连接池和Mybatis的简单配置方法

    主要介绍了spring boot配置MySQL数据库连接、Hikari连接池和Mybatis的简单配置方法,需要的朋友可以参考下

    mysql数据库管理工具

    Navicat for MySQL是一个强大的MySQL数据库管理和开发工具。Navicat为专业开发者提供了一套强大的足够尖端的工具,但它对于新用户仍然是易于学习。使用了极好的图形用户界面(GUI),可以让你用一种安全和更为容易的...

    Java中数据库驱动程序加载及建立连接

    Java开发中DB2、Oracle、SQL Server、Sybase、MySQL等数据库的驱动程序的加载及建立连接

    mysql数据库my.cnf配置文件

    # MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,...

    基于MySQL的数据库中间件Meituan-DBProxy.zip

    当发向某个MySQL后台的的并发查询超过某个阈值时,会进行超时等待,直到有可用的连接,其中阈值与超时等待的时间都已经参数化,可以动态配置 set backend offline不再显示节点状态 支持set ...

    IDEA配置连接MYSQL数据库遇到Failed这个问题解决

    本文主要介绍了IDEA配置连接MYSQL数据库遇到Failed这个问题解决,分享给大家,具体如下:   错误位置如下 我们改过来 发现就能正常连接 IDEA尝试连接Mysql时失败 在尝试用IDEA连接的Mysql时一直显示连接失败,...

    MFC通过ado类连接SQL、MYSQL、ACCESS多种数据库

    1.支持连接SQL,MYSQL、ACCESS enum DriverTypeEmum{ driverODBC = 0, driverSQLServer, driverACCESS97, driverACCESS2000, driverACCESSXP, driverEND}; 2.连接信息可通过结构体修改 typedef struct ...

    Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

    MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名在权限系统里面进行权限判断。反向DNS解析是耗费时间的,有可能让用户感觉起来很...

    Navicat导航貓MySQL数据库管理工具

    Navicat导航貓 - 简体中文版 &lt;br&gt;软件简介:Navicat导航貓是一个强大的MySQL数据库管理和开发工具。Navicat导航貓为专业开发者提供了一套强大的足够尖端的工具,但它对于新用户仍然是易于学习。Navicat,使用了极...

    mysql C API

    1. 支持多地址分布式部署数据库连接; 2. 支持数据库连接池; 3. 支持数据库字符转义,能保持包括 ' 等字符到数据库 4. 支持客户端编码类型指定,解决中文乱码问题 3. 2013年 版本是原来版本的修正版本; 主要增加功能...

    Spring Boot如何解决Mysql断连问题

    本篇文章主要介绍了Spring Boot如何解决Mysql断连问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    dubbo中zookeeper请求超时问题:mybatis+spring连接mysql8.0.15的配置

    却卡第一个测试上,启动provider服务和Consumer服务,请求接口却始终报zookeeper请求超时错误(dubbo+zookeeper服务端重复调用三次),经过排查,我的问题是出在dao层与数据库连接的问题上(而且provider方还不报错,...

Global site tag (gtag.js) - Google Analytics