我什么时候用MVC(PHP)创建数据库连接


When do I create my database connection in MVC (PHP)?

我在一个调用我继承的抽象类的基类中得到这个吗?

class ConcreteClass extends MyAbstractClass(){
  public function __construct(){
    parent::__construct();  //or other method that returns my adapter, PDO in this case.
  }
}

或者,我是否在创建的每个对象引用上都获得一个新的适配器:

class ConcreteClass extends BaseClass(){  //or no class extension for that matter
  public function __construct(){
     public function __construct(DB $adapter) {  //or call DB on another class for DI via set/get
        $this->adapter = $adapter;
        $this->adapter->connect();
    }
  }
}

我将创建一个到数据库的新连接,并创建每个对象。这不好吗?除了我不想使用的singleton之外,我不知道还有其他方法可以做到这一点。

http request->controller->最终我得到了我的对象,它在每次创建对象时调用数据库,新的连接。

我已经创建了一个类型为"DB"的接口或抽象类,因此如果需要,我可以更改我的数据源,尽管我已经在使用PDO了。

您可以查看Laravel框架是如何解决这一问题的-请参阅https://github.com/illuminate/database/blob/master/DatabaseManager.php.此DatabaseManager对象的AFAIK单个实例存储在Laravel-ioc容器中。

"我会在创建每个对象的情况下创建一个到数据库的新连接。这很糟糕吗?"-取决于:

  1. 当连接到远程机器时,为每个对象创建新连接可能会耗费时间/资源,尤其是当您有很多对象时
  2. 您还可能达到某种最大连接限制,尤其是当嵌套类使用单独的连接时(也就是说,存储连接的对象的refcount在脚本执行结束前不会达到0)
  3. AFAIK所有与事务相关的东西只能在单个连接上操作,所以当您使用单独的连接时,比如说在持久层中,没有办法在服务层中使用事务逻辑

还有IMHO,如果你需要换掉PHP中的数据源,你已经完蛋了。PDO是PHP所能提供的最好的,它一点也不好——它只为您提供持久的PHP API,您仍然需要手动转换所有特定于供应商的SQL。