关闭PDO连接问题

时间:2014-04-24 22:01:30

标签: php mysql database pdo

我的PDO连接有问题! 我读到我不想关闭PDO连接因为会自动关闭! 但如果你想手动关闭它,我需要将Null分配给连接变量。 但我使用数据库类,数据库查询就像这样运行!

$addUser = users::getInstance()->userAdd($data);

和users类包含以下内容

class users extends DB {
private static $_instance = null;   
public static function getInstance(){

if (!isset(self::$_instance)){
    self::$_instance = new users();
}
return self::$_instance;
} 
 [...]
 }

和数据库类

    class DB {

    private static $_instance = null;
    private $_con;
        [...]

    public function __construct(){
        try{
    $this->_con = new PDO('mysql:host=localhost';dbname=db,user,pass);  
        }catch(PDOException $e){
            die ($e->getMessage());
        }
    } 

public function __destruct (){
    $this->close();
}

public static function getInstance(){
    if (!isset(self::$_instance)){
        self::$_instance = new DB();
    }
    return self::$_instance;
}

public function close(){
    $this->_con = null;
}
[...] }

问题是脚本没有关闭连接,因为当我限制我的localhost中的最大用户连接或使用已经限制它的免费虚拟主机服务时,我收到此错误消息

SQLSTATE[HY000] [1203] User 'userName' already has more than 'max_user_connections' active connections

我需要一个解决方案,以便在我使用实例方法建立连接时关闭连接来避免此错误消息!

2 个答案:

答案 0 :(得分:3)

  1. 摆脱数据库课程。
  2. 不要从DB类扩展应用程序类。
  3. 不要玩静态魔法。
  4. 创建原始PDO对象并将其传递给应用程序类
  5. 忘掉这个连接的东西
  6. 所以它是:

    $pdo  = new PDO('mysql:host=localhost;dbname=db','user','pass');    
    $user = new users($pdo);
    $user->select();
    
    class users
    {
        protected $db;
    
        function __construct($pdo){
            $this->db = $pdo;
        }
        function select()
        {
            $this->db->query("select 1");
        }
    }
    

    这样,每个脚本实例只会创建一个连接,并且您再也不会遇到这样的错误。

答案 1 :(得分:0)

我要离开这里,提醒我在发布“不太有用”的答案之前先思考一下。 ; - /

请使用“您的常识”提供的答案与全局,重复使用的连接

不要再读了......

停止扔掉未使用过的连接!让他们活跃!

完成“连接”后,将其返回到“空闲列表”数组。不要破坏它

1)当您想要新的数据库连接时,请检查“空闲列表”。如果可用的话,抓住最顶层的。

2)如果没有免费的可用,请创建一个并使用它。

3)完成后将其放入免费列表。不要关闭它!

将“免费列表”实现为“堆栈”。我还保留了一份“活动连接列表”。当一个人完成后,将其返回到“免费列表”。

这很有用

您可能会用尽“数据库句柄”,但您需要十个活动的重叠活动事务。