`

MySQL连接超时关闭问题解决

 
阅读更多

PS:原创文章,如需转载,请注明出处,谢谢!     

本文地址:http://flyer0126.iteye.com/blog/2346265

 

1、应用程序(比如PHP)长时间的执行批量的MYSQL语句。
最常见的就是采集或者新旧数据转化。

 

SHOW VARIABLES LIKE '%timeout%’

 

解决方案:
my.ini文件中添加或者修改以下两个变量:
wait_timeout=2880000
interactive_timeout = 2880000


关于两个变量的具体说明可以google或者看官方手册。
如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,比如:
sql = "set interactive_timeout=24*3600";
mysql_real_query(...)


2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。
比如,图片数据的处理

 

SHOW VARIABLES LIKE '%max_allowed_packet%’

 
解决方案:

my.cnf文件中添加或者修改以下变量:
max_allowed_packet = 10M  (也可以设置自己需要的大小)
max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。

 

3、检查MySQL的链接状态,使其重新链接

 

<?php
// 数据库操作类
class DB{

    // 保存数据库连接
    private static $_instance = null;

    // 连接数据库
    public static function get_conn($config){
        if(isset(self::$_instance) && !empty(self::$_instance)){
            return self::$_instance;
        }

        $dbhost = $config['host'];
        $dbname = $config['dbname'];
        $dbuser = $config['user'];
        $dbpasswd = $config['password'];
        $pconnect = $config['pconnect'];
        $charset = $config['charset'];

        $dsn = "mysql:host=$dbhost;dbname=$dbname;";
        try {
            $h_param = array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            );
            if ($charset != '') {
                $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼
            }
            if ($pconnect) {
                $h_param[PDO::ATTR_PERSISTENT] = true;
            }
            $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);

        } catch (PDOException $e) {
            throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
        }

        self::$_instance = $conn;
        return $conn;
    }

    // 执行查询
    public static function query($dbconn, $sqlstr, $condparam){
        $sth = $dbconn->prepare($sqlstr);
        try{
            $sth->execute($condparam);
        } catch (PDOException $e) {
            echo $e->getMessage().PHP_EOL;
            self::reset_connect($e->getMessage()); // 出错时调用重置连接
        }
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }

    // 重置连接
    public static function reset_connect($err_msg){
        if(strpos($err_msg, 'MySQL server has gone away')!==false){
            self::$_instance = null;
        }
    }

}
?>

 

分享到:
评论

相关推荐

    mysql 8小时空闲后连接超时的问题

    在描述中提到的解决方案是通过调整MySQL的配置来解决8小时空闲后连接超时的问题。有两种方法: 1. 修改启动参数: 在启动MySQL服务时,可以添加`--interactive_timeout=288000`参数,将交互式连接的超时时间设置为...

    mysql连接驱动jar包

    这篇文档将深入探讨MySQL连接驱动jar包的相关知识点,包括其作用、安装与配置、使用方法以及常见问题。 首先,了解MySQL连接驱动的作用。当Java程序需要访问MySQL数据库时,必须加载对应的JDBC驱动,即mysql-...

    MySQL wait_timeout连接超时

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

    c# mysql数据库连接池实现

    `Pomelo`是社区维护的MySQL Entity Framework Core提供者,而`MySql.Data`则是官方提供的非Entity Framework解决方案。 2. 配置连接字符串 在应用程序配置文件(如appsettings.json)中,配置MySQL数据库的连接...

    Qt Mysql超时断开后自动重连完美解决方法

    网上找了很多解决办法,几乎没有一个能完美解决问题的,大体都是首先执行一段query后看返回结果,但这个办法也太无用和耗费资源了吧...因为断开后isOpen和isValid都会返回true,所以不能从这里入手...

    mysql连接池java源码

    MySQL连接池在Java应用开发中扮演着至关重要的角色,它是一种管理数据库连接的机制,能够有效地提高数据库操作的性能和效率。在这个项目中,我们看到的是一个纯手工编写的Java源码实现,不依赖任何外部数据库驱动,...

    多线程下mysql连接数过多解决demo

    以下是一些解决多线程下MySQL连接数过多问题的方法和策略: 1. **连接池管理**: 使用连接池(如C3P0、HikariCP、Druid等)是解决这个问题的关键。连接池能够复用已建立的数据库连接,避免频繁地创建和销毁连接,...

    javaee mysql空闲关闭

    6. **应用层处理异常**:在应用代码中捕获并处理因连接超时引起的异常,当发生这类异常时,尝试重新获取连接。 总之,处理JavaEE应用中的MySQL空闲关闭问题需要综合考虑数据库服务器的配置、连接池的管理策略以及...

    Mysql连接池

    在高并发的Web应用中,频繁地创建和销毁数据库连接会消耗大量系统资源,增加延迟,而连接池通过复用已建立的数据库连接来解决这个问题。下面我们将深入探讨MySQL连接池的相关知识点。 1. **连接池原理**: 连接池...

    MySql数据库连接池C#代码(有注释含测试代码)

    MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...

    MySQL Sleep连接过多问题解决方法

    总的来说,解决MySQL Sleep连接过多问题需要从源头上找出原因,通过优化程序、调整服务器配置以及定期监控来改善数据库性能。同时,了解并掌握MySQL的连接管理机制对于预防此类问题的发生至关重要。

    线程池和mysql连接池的实现

    线程池和MySQL连接池是两种重要的资源管理技术,在多线程编程和数据库操作中扮演着关键角色。本文将详细探讨这两个概念,并结合在Ubuntu 12.04环境下使用C++实现线程池和MySQL连接池的方法。 线程池是一种优化并发...

    网络收集 C++ MYSQL 连接池 可编译运行

    本资源包含了一个可编译运行的C++ MySQL连接池示例,这对于理解和实践C++中的数据库管理是非常有价值的。 首先,连接池的概念是这样的:它是一组预先初始化的数据库连接,程序在需要时可以从池中获取一个已存在的...

    mysql的连接数据问题

    一、MySQL连接方式 1. 命令行连接:通过终端或命令提示符输入`mysql -u username -p`,然后输入密码,可以直接连接到MySQL服务器。 2. 图形化工具连接:例如MySQL Workbench、phpMyAdmin、Navicat等,提供直观的界面...

    mysql连接池

    MySQL连接池是数据库管理中的一个重要概念,主要用于优化数据库应用程序的性能和效率。它是一组预先建立的数据库连接,这些连接可以被多个用户或线程共享,而不是为每次数据库操作都创建新的连接。这样做的好处是...

    Mybatis破MySql8小时断线问题1

    标题 "Mybatis破MySql8小时断线问题1" 指的是在使用Mybatis框架与MySQL数据库交互时遇到的一个常见问题,即由于MySQL数据库的连接超时机制导致的8小时断线。描述中提到,当数据库连接闲置时间超过MySQL默认设定的8...

    mysql C++连接池

    `SqlHelper`类可能是一个通用的SQL操作助手类,而`ConnPool`类则可能是实现MySQL连接池的类。 `SqlHelper`类可能包含以下功能: 1. 提供SQL语句执行的方法,如执行查询、更新、插入等操作。 2. 包含事务管理功能,...

    MySql连接数据库(方法、代码、用到的所有组件)

    以下是对MySQL连接数据库涉及的知识点的详细说明: 1. **连接方式**: - **命令行客户端**:这是最基础的连接方式,通过MySQL的命令行界面输入SQL语句与数据库交互。 - **图形化界面工具**:如MySQL Workbench、...

    安卓连接MySql数据库

    此外,由于MySQL服务器通常不在本地运行,所以需要处理网络延迟和连接超时问题。可以设置合适的连接超时和读写超时参数,如下所示: ```java Properties props = new Properties(); props.setProperty("connect...

Global site tag (gtag.js) - Google Analytics