【问题标题】:How Zend DB Manage Database ConnectionsZend DB 如何管理数据库连接
【发布时间】:2012-09-21 02:58:19
【问题描述】:

我正在使用 Zend Framework 进行 PHP 开发,这是我用来执行查询的一个小函数。这与错误无关。代码和一切正常。但我想知道这背后的一些概念。

/** 
    * Get dataset by executing sql statement
    * 
    * @param  string $sql - SQL Statement to be executed
    * 
    * @return bool 
    */
    public function executeQuery($sql)
    {
        $this->sqlStatement = $sql;

        if ($this->isDebug)
        {
            echo $sql;
            exit;
        }

        $objSQL = $this->objDB->getAdapter()->prepare($sql);

        try
        {           
            return $objSQL->execute();

        }
        catch(Exception $error)
        {

            $this->logMessage($error->getMessage() . "  SQL : " .$sql);
            return false;
        }
        return false;
    }

下面是我不清楚的地方。

  1. Zend_Db_Table_Abstract 如何维护数据库连接?
  2. 当我调用这个函数时,它是一直在创建新的连接,还是它有一些连接池?
  3. 我没有编写任何代码来打开或关闭数据库连接。那么zend框架会自动关闭连接吗?
  4. 如果我执行此函数时此打开和关闭连接一直有效,是否存在性能问题?

感谢您并感谢您对此提出的建议和意见。

【问题讨论】:

    标签: php mysql zend-framework zend-db zend-db-table


    【解决方案1】:

    创建连接

    创建适配器类的实例不会立即连接到 RDBMS 服务器。适配器保存连接参数,并按需进行实际连接,这是您执行查询所需的第一次。这确保了创建 Adapter 对象既快速又便宜。即使您不确定在应用程序正在处理的当前请求期间是否需要运行任何数据库查询,您也可以创建适配器的实例。

    如果您需要强制适配器连接到 RDBMS,请使用 getConnection() 方法。此方法返回连接的对象,由相应的 PHP 数据库扩展表示。例如,如果您为 PDO 驱动程序使用任何 Adapter 类,则 getConnection() 在将 PDO 对象初始化为与特定数据库的实时连接后返回它。

    如果您想捕获由于帐户凭据无效或其他无法连接到 RDBMS 服务器而引发的任何异常,强制连接会很有用。在建立连接之前不会抛出这些异常,因此如果您在一个地方而不是在第一次查询数据库时处理异常,它可以帮助简化您的应用程序代码。

    此外,适配器可以被序列化以存储它,例如,在会话变量中。这不仅对适配器本身非常有用,而且对聚合它的其他对象(如 Zend_Db_Select 对象)非常有用。默认情况下,适配器是允许被序列化的,如果你不想要它,你应该考虑使用 FALSE 传递 Zend_Db::ALLOW_SERIALIZATION 选项,参见上面的例子。为了尊重惰性连接原则,适配器在反序列化后不会重新连接自己。然后您必须自己调用 getConnection()。您可以通过传递带有 TRUE 的 Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE 作为适配器选项来使适配器自动重新连接。

    关闭连接

    通常不需要关闭数据库连接。 PHP 会自动清理所有资源并结束一个请求。数据库扩展旨在在清除对资源对象的引用时关闭连接。

    但是,如果您有一个启动许多数据库连接的长时间 PHP 脚本,您可能需要关闭连接,以避免耗尽您的 RDBMS 服务器的容量。您可以使用 Adapter 的 closeConnection() 方法显式关闭底层数据库连接。

    从 1.7.2 版开始,您可以使用 isConnected() 方法检查您当前是否连接到 RDBMS 服务器。这意味着连接资源已启动且未关闭。此功能目前无法测试例如服务器端关闭连接。这在内部用于关闭连接。它允许您多次关闭连接而不会出错。 PDO 适配器在 1.7.2 之前已经是这种情况,但对于其他适配器则不然。

    More information

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      相关资源
      最近更新 更多