PDOException:SQLSTATE [08004] [1040]连接太多

时间:2018-07-14 22:30:47

标签: php database class pdo

我的数据库有问题;过去半年来,我一直在运营一个网站,从现在开始它一直运行良好,因为它在访问该网站时输出错误:

  

数据库无法连接:PDOException:SQLSTATE [08004] [1040]太   dbconfig.php中有许多连接:14

我已经研究了很长时间,但是找不到导致此问题的原因的单一解决方案,因为半年后它突然出现是很奇怪的。

我的连接代码如下:

class Database {
    private $host = "localhost";
    private $db_name = "[...]";
    private $username = "[...]";
    private $password = "[...]";

    public $conn;

    public function dbConnection() {
        $this->conn = null; 

        try {
            $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   
        } catch(PDOException $exception) {
            exit('Database failed to connect: ' . $exception);
        }

        return $this->conn;
    }
}

问题可能是什么?我也在其他网站上也使用了此代码,所以我希望这些网站不会很快出现相同的错误。

1 个答案:

答案 0 :(得分:1)

您似乎在破坏这段代码中不必要的连接。如果已经建立连接,则应该重新使用该连接。同样,如果您有任何打开的语句或结果,这实际上不会关闭连接,但会打开另一个连接。这可能是您的问题。同样,这实际上取决于您在实际脚本中如何使用此类。在同一脚本中重复调用此命令可能会导致您的问题。

因此,如果已经建立连接,则不要重用它。如果仅出于实际原因而与数据库建立连接,则该过程相对较慢。这通常称为Singleton模式。

class Database {
    private $host = "localhost";
    private $db_name = "[...]";
    private $username = "[...]";
    private $password = "[...]";

    public $conn = null;

    public function dbConnection() {
        if ( $this->conn !== null ) {
            // already have an open connection so lets reuse it
            return $this->conn;
        }

        try {
            $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   
        } catch(PDOException $exception) {
            exit('Database failed to connect: ' . $exception);
        }

        return $this->conn;
    }
}