`

dbcp不知MySQL已经'wait_timeout'

 
阅读更多

由dbcp不知MySQL已经'wait_timeout'而引出的

2011-09-10 22:42:13
    前几天在看一个应用的日志时,发现与MySQL连接时发生如下错误:

The last packet successfully received from the server was XXXXXX seconds ago.
The last packet sent successfully to the server was XXXXXX seconds ago,
which 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

大概意思是距离上一次连接MySQL的间隔时间,已经超出了MySQL设置的'wait_timeout'时长啦。
连上MySQL,

mysql> show global variables like 'wait_timeout';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| wait_timeout | 172800 |
+----------------------------+--------+

可以看到MySQL设置的wait_timeout是24小时,而日志显示上一次访问MySQL的时间已超出24小时。
    确认了问题后,就大概可以知道原因:项目使用dbcp管理jdbc连接。当超过'wait_timeout'时长后,MySQL会自动断开连接;而dbcp这边并不知道,当再次使用该连接时,发现连接不可用,就会报如上错误了。
    解 决的方法主要有两种,一是增加MySQL的'wait_timeout'时长;二是保证连接在MySQL的'wait_timeout'时间内,至少访问 一次数据库。第一种方法,DBA是断然不会同意的(DBA也是有气节的,不会被开发任意鱼肉啊-_-|||...)。而且应用如果不能确定最长 'wait_timeout'时间,则该值无论如何设定,理论上也无法避免如上问题。所以只能保证应用在MySQL的'wait_timeout'时间 内,至少访问一次数据库。
    该方法实现也很简单,只需配置dbcp的三个配置项timeBetweenEvictionRunsMillis、testWhileIdle与validationQuery即可。

timeBetweenEvictionRunsMillis=86400 # 失效检查线程运行时间间隔,要小于MySQL的'wait_timeout'时间(如果小于等于0,不会启动检查线程)
testWhileIdle=true # 检查连接是否有效
validationQuery=SELECT 1 FROM dual # 检查连接有效性的SQL语句

这 样dbcp会在timeBetweenEvictionRunsMillis指定的时间间隔(小于MySQL的'wait_timeout')内,通过 validationQuery指定的SQL语句来检查连接是否有效。避免了连接因长时间未执行SQL语句,而造成MySQL关闭连接。
    但 是具体的实现到底是怎样的呢?dbcp中,org.apache.commons.dbcp.BasicDataSource是使用apache commens pool中的org.apache.commons.pool.impl.GenericObjectPool来管理对象池的。

 


BasicDataSource会将testWhileIdle、timeBetweenEvictionRunsMillis传给GenericObjectPool。

 


GenericObjectPool将testWhileIdle、timeBetweenEvictionRunsMillis分别赋给属性_testWhileIdle与_timeBetweenEvictionRunsMillis。

 


然 后GenericObjectPool执行startEvictor(_timeBetweenEvictionRunsMillis)方法。该方法启动 一个EvictionTimer,根据timeBetweenEvictionRunsMillis指定的时间执行_evictor任务。

 


其中,EvictionTimer使用java.util.Timer来调度任务。而_evictor是Evictor类型对象,该类型继承java.util.TimerTask类。_evictor的run()方法中会执行evict()方法。

 


在evict()方法中,则通过_factory属性的validateObject(pair.value)方法来与MySQL通讯。

 


而这里的_factory属性,是BasicDataSource在构造PoolableConnectionFactory对象时,由PoolableConnectionFactory在自己的构造方法中,将自己指定给GenericObjectPool的。

 


 


由 上图可以看到,validationQuery在构造PoolableConnectionFactory时,一并传入。 PoolableConnectionFactory的validateObject(pair.value)方法,会调用 validateConnection(Connection conn)方法,并在该方法中执行validationQuery。

 


 


    Apache commens pool是一个通用的对象池管理组件。正因为其通用性,池中对象有效性的判断方法,就不能加以限定,而是要根据生成该对象池的工厂来实现。dbcp中的 PoolableConnectionFactory正是根据这一点,将与数据库的连接放在validateConnection方法中实现。
btw:回到最初异常的最后一行

or using the Connector/J connection property 'autoReconnect=true' to avoid this problem

autoReconnect=true在MySQL 5之前的版本可用,但是在MySQL 5之后的版本貌似不可用了。
另外validationQuery=SELECT 1 FROM dual中,dual只是一个虚表,在MySQL中并不存在,查询时也不关联。只是为了保持select … from … 的形式罢了。
分享到:
评论

相关推荐

    MySQL wait_timeout连接超时

    MySQL的`wait_timeout`连接超时问题通常出现在长时间无操作的数据库连接上,服务器会自动关闭这些连接以释放资源。这种现象在应用中可能导致突然的数据通信中断,表现为“Communications link failure”等错误,提示...

    javaee mysql空闲关闭

    然而,为了优化资源使用,MySQL配置了一个参数`wait_timeout`,这个参数定义了连接在空闲多长时间后会被自动关闭。当JavaEE应用中的数据库连接在超过这个设定的时间没有执行任何操作,MySQL服务器会断开这个连接,这...

    dbcp.rar_Commons-jdbc.zip jar_DBCP_commons jdbc_dbcp jar_dbcp.ja

    标题中的"dbcp.rar_Commons-jdbc.zip jar_DBCP_commons jdbc_dbcp jar_dbcp.jar"提到了几个关键元素,这些元素都是关于Java数据库连接池(JDBC Connection Pool)技术的,特别是Apache Commons DBCP组件。...

    Commons-DBCP-1_2_2-Api

    Apache commons dbcp 1.2.2 连接池 API文档

    数据库连接池基础知识_dbcp_c3p0_简单了解

    本文将深入探讨数据库连接池的基础知识,特别是关于DBCP(Jakarta Commons DBCP)和C3P0两个流行的连接池实现。 首先,让我们了解什么是数据库连接池。数据库连接池是在应用服务器启动时创建的一组预定义的数据库...

    DBCP.rar_DBCP PoolManager_commons-dbcp.jar_dbcp jar

    DBCP,全称为Apache Commons DBCP(Database Connection Pool),是Apache软件基金会开发的一个开源项目,主要用于提供数据库连接池服务。在Java应用中,DBCP是实现数据库连接管理的重要工具,能够有效地管理和复用...

    mysql8 DBCP连接池jar依赖

    用于实现DBCP连接池所用的JAR依赖文件,包括数据库驱动及创建连接池所需的其他依赖: * commons-collections  * commons-dbcp2  * commons-logging  * commons-pool2  * mysql-connector

    java_connetto_Mysql.rar_MYSQL_ROOT_java mysql

    这个"java_connect_to_Mysql.rar"压缩包显然包含了有关如何使用Java连接到MySQL数据库,特别是使用连接池技术的相关资源。让我们深入探讨一下这个主题。 首先,连接池是一种管理数据库连接的机制,它允许程序重复...

    JDBC与DBCP连接mysql工程

    "JDBC与DBCP连接mysql工程"是一个专注于使用Java JDBC和DBCP(Apache Commons DBCP)连接MySQL数据库的学习资源。这里我们将详细探讨这两个关键技术及其在实际工程中的应用。 JDBC(Java Database Connectivity)是...

    linux 后台日志 mysql 错误异常的解释(推荐)

    这个错误表明,客户端与MySQL服务器之间的通信已经超过了服务器配置的`wait_timeout`值。`wait_timeout`是一个服务器配置参数,它定义了在没有活动的客户端连接时,MySQL服务器会等待多长时间后关闭连接。默认情况下...

    MVC_Mysql.rar_java MVC_java MVC mysql_java 案例_mvc_mvc框架

    【标题】"MVC_Mysql.rar_java MVC_java MVC mysql_java 案例_mvc_mvc框架" 提供了一个关于Java MVC框架与MySQL数据库结合的实践案例。MVC(Model-View-Controller)是一种广泛用于Web应用程序开发的设计模式,旨在...

    commons-dbcp-1.2.2源码

    Apache Commons DBCP(数据库连接池)是Java开发中常用的一个数据库连接池组件,它是在Apache Commons项目下的一份开源库。源码分析对于理解其工作原理和优化应用至关重要。在"commons-dbcp-1.2.2源码"中,我们可以...

    使用DBCP创建MySQL数据库连接池

    本篇文章将详细介绍如何使用DBCP来创建一个针对MySQL数据库的连接池。 首先,我们需要了解DBCP的基本概念。DBCP全称为Apache Commons DBCP,它是基于Apache Commons Pool对象池API构建的,主要功能是管理数据库连接...

    mysql_connector_java_5.1.30

    MySQL Connector/J 5.1.30 是 MySQL 官方提供的用于 Java 应用程序连接 MySQL 数据库的驱动程序。这个版本的驱动是 JDBC(Java Database Connectivity)接口的一个实现,使得 Java 开发者能够轻松地在 Java 程序中...

    实例操作MySQL短链接

    首先,我们需要理解MySQL中的`wait_timeout`参数。这个参数定义了在服务器端,当一个非交互式的客户端(如Web应用)在没有任何活动(如SQL查询)的情况下,等待多久后自动关闭连接。默认值通常为8小时(28800秒),...

    mysql-connector、c3p0、dbcp 所需jar包

    "mysql-connector、c3p0、dbcp"这三个关键词涉及到的是Java与MySQL交互的库以及连接池技术。下面将详细讲解这些知识点。 首先,`mysql-connector`,全称为`mysql-connector-java`,是MySQL官方提供的Java驱动程序,...

    JDBC_MYSQL.rar_JDBC-MYSQL_java jdbc mysql_java sql 简单

    - 在实际应用中,为了提高性能和资源利用率,通常使用连接池(如C3P0、HikariCP、Apache DBCP等)来管理数据库连接。 9. **示例代码**: ```java try { Class.forName("com.mysql.jdbc.Driver"); Connection ...

    mysql_connector_java_5.1.44

    像C3P0、Apache DBCP或HikariCP这样的连接池库通常与MySQL Connector/J一起使用。 6. **性能优化**:5.1.44版本可能包含针对特定场景的性能优化,例如使用连接压缩减少网络传输,或者优化查询缓存。 7. **兼容性**...

    mysql.zip_mysql驱动

    MySQL驱动通常支持连接池功能,如Apache Commons DBCP或HikariCP。 4. 数据库连接参数:连接MySQL数据库时,需要提供一些关键参数,如服务器地址(hostname)、端口号(port)、数据库名(database)、用户名...

    dbcp_2.1_api.chm

    dbcp_2.1_api.chm,对api文件进行了编译

Global site tag (gtag.js) - Google Analytics