php - 是什么原因导致DB PDO连接失败: SQLSTATE[08004] [1040] Too many connections

标签 php mysql database pdo

我已经被这个错误困扰好几天了,但我找不到解决它的方法。我尝试过实现

  • 单例数据库对象
  • 查询后关闭我的连接
  • 尝试持久连接
  • 将最大连接数设置为 250(本地)
  • 将最大用户连接数设置为 250(本地)

其他人也遇到过这种情况吗?

<小时/>

奇怪的是我的本地服务器上的错误消息是连接失败:SQLSTATE[08004] [1040]但行仍然是插入并且数据库查询工作。

在生产服务器上,错误消息变为连接失败:SQLSTATE[42000] [1203]用户 db_admin 已拥有超过 'max_user_connections' 事件连接 我知道最大连接数设置为 15,但是我咨询了支持人员,他们说发生此错误时我没有连接。

在我做出所有选择之后,有人可以检查我的代码以确保其中没有可能导致这些错误的错误吗?

class MyPDO extends PDO{

    const DB_HOST='localhost';
    const DB_PORT='3306';
    const DB_NAME='db_name';
    const DB_USER='db_admin';
    const DB_PASS='SECRET';

    public function __construct(){

        parent::__construct('mysql:host='.MyPDO::DB_HOST.';port='.MyPDO::DB_PORT.';dbname='.MyPDO::DB_NAME,
                            MyPDO::DB_USER,MyPDO::DB_PASS);
        try{
                $this->db = new MyPDO();
                $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
            }catch(PDOException $e){
                //always catching the connection errors
                echo 'Connection failed: ' . $e->getMessage();
            }
    }

    public function query($query){ 
        $args = func_get_args();
        array_shift($args); 
        //check inputs
        var_dump($args);
        $reponse = parent::prepare($query);
        $reponse->execute($args);
        return $reponse;    
    }  
}

这是插入查询

function InsertUserToSql()
    {
        $ret = $this->db->query("INSERT INTO CD_USERS (email,username,password,fname,lname,dob,gender) VALUES 
        (?,?,?,?,?,?,?)",$this->Email,$this->Username,$this->Password,$this->Fname,
        $this->Lname,$this->Birthday,$this->Gender);
        if($ret){
            echo "insert success";
            return $this->db->lastInsertId();
        } 
        $this->db = null;
    }  

最佳答案

不要扩展PDO,事实上,永远不要扩展不属于您的对象。扩展 PDO 对于最终使用你的代码的人来说很烦人,它完全没有意义(你想做什么?改进清晰且众所周知的 PDO API?或者创建一个适合的对象你当前的需求更好 - 这意味着:创建一个你将无法再次使用的对象,这违背了 OOP 的要点)? I've been over quite a few reasons why you shouldn't extend from PDO here ,也许值得一看。

您的实际问题:

不要在类自己的构造函数中创建类的新实例!

MyPDO 构造函数中创建新的 MyPDO 将再次调用 MyPDO 构造函数,这将创建 MyPDO 的新实例,这将再次调用 MyPDO 构造函数,这将创建 MyPDO 的新实例,该实例将再次调用 MyPDO 构造函数,这将...
这就是无限递归在起作用。

这样想:如果有人告诉你:

“如果您将右脚移到左脚前面,则必须再次将右脚移到左脚前面”
然后,那个固定行走的虐待狂疯子会指导你(用枪指着):
“现在将右脚放在左脚前面”
您需要多长时间才能完成您的Grand ecart(或拆分),并且无法再进一步。这就是您的代码中发生的情况。

而且,稍微偏离主题,如果您遇到问题,并尝试使用 PHP 中的单例来解决它,那么您就会引入一个新问题......

关于php - 是什么原因导致DB PDO连接失败: SQLSTATE[08004] [1040] Too many connections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623557/

相关文章:

php - 如果多维数组中的键值对匹配,如何合并两个具有平均值的数组

php - Android 将数据插入实时 mysql 数据库

php - 使用 TinCan API 从 Learning Locker LRS 获取语句

mysql - 如何从多表条件求和查询中仅选择非零值

mysql - 如何从不同的表中选择值?

sql-server - 聚簇索引 SQL Server

php - 解决Mysql随机查询转到另一个页面时迁移的问题

Mysql命令不同选择

ruby-on-rails - 我应该为我使用查找的每个字段添加数据库索引吗?

sql - 外部连接 SQL 表?