Singleton有多个数据库

Moh*_*mar 6 php singleton multiple-databases

示例应用程序,具有员工信息并由不同的应用程序(如工资单和pos)访问.我将员工数据放在一个数据库中,工资单数据和pos分别位于不同的数据库中.

我有一个像下面这样的数据库连接类,所以每次我想获得与数据库的连接我就是这么做的$conn = Database::getInstance(db1).

效果很好,但基本上超级慢.使应用程序运行非常慢.关于为什么那样或更好的替代想法的任何提示?

任何帮助将不胜感激

<?php    
class Database {
        private $db;
        static $db_type;
        static $_instance;

        private function __construct($db){
            switch($db) {
                case "db1":
                  try{
                      $this->db = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
                  }
                  catch(PDOException $e){
                      print "Error!: " . $e->getMessage() . "<br />";
                      die();
                  }
                break;
                case "db2":
                  try{
                      $this->db = new PDO("mysql:host=" . DB_HOST_2 . ";dbname=" . DB_NAME_2, DB_USER_2, DB_PASSWORD_2);
                  }
                  catch(PDOException $e){
                      print "Error!: " . $e->getMessage() . "<br />";
                      die();
                  }
                break;
            }
            self::$db_type = $db;

        }

        private function __clone(){}

        static function getInstance($db_type){
            if(!(self::$_instance) || $db != self::$db_type){
                self::$_instance = new self($db_type);
            }
            return self::$_instance;
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

小智 1

有了这个设计。如果更改数据库,则会破坏与先前数据库的连接。

为每个连接创建单独的对象,然后在连接对象之间切换。

此外,出于同样的原因,这也不是线程安全的。如果多个函数同时调用此函数,则一个函数可以在加载完成之前断开另一个函数的连接。

您确实应该为每个函数创建一个新的连接对象,而不是在函数或其他对象之间共享它。

  • 供其他人参考: `static function getInstance($db_type = ""){ if(!isset(self::$connections[$db_type])){ self::$connections[$db_type] = new self($db) ; 返回 self::$connections[$db_type]; }` (2认同)