5

我正在使用 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. 如果我执行此功能时此打开和关闭连接一直有效,是否有任何性能问题?

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

4

1 回答 1

15

创建连接

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

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

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

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

关闭连接

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

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

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

更多信息

于 2012-09-21T07:12:38.503 回答