2012-09-21 35 views
5

Tôi đang sử dụng Zend Framework cho sự phát triển PHP của mình và đây là một hàm nhỏ mà tôi đã sử dụng để thực hiện truy vấn. Đây không phải là lỗi. Mã và mọi thứ hoạt động tốt. Nhưng tôi muốn biết một số khái niệm đằng sau điều này.Cách Zend DB quản lý kết nối cơ sở dữ liệu

/** 
    * 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; 
    } 

Dưới đây là các khu vực không rõ ràng đối với tôi.

  1. Cách Zend_Db_Table_Abstract Duy trì kết nối cơ sở dữ liệu?
  2. Có phải lúc nào nó cũng tạo kết nối mới khi tôi gọi chức năng này hoặc nó có một số kết nối tổng hợp không?
  3. Tôi không viết bất kỳ mã nào để mở hoặc đóng kết nối cơ sở dữ liệu. Vì vậy, sẽ zend khung tự động đóng các kết nối?
  4. Nếu kết nối mở và đóng này hoạt động mọi lúc nếu tôi thực hiện chức năng này, Có sự cố về hiệu suất nào không?

Cảm ơn và đánh giá cao các đề xuất và ý kiến ​​của bạn về điều này.

Trả lời

15

Tạo kết nối

Tạo một thể hiện của một lớp Adaptor không ngay lập tức kết nối đến máy chủ RDBMS. Bộ điều hợp lưu các thông số kết nối và thực hiện kết nối thực tế theo yêu cầu, lần đầu tiên bạn cần thực hiện truy vấn. Điều này đảm bảo rằng việc tạo ra một đối tượng Adapter là nhanh chóng và không tốn kém. Bạn có thể tạo một thể hiện của một Adapter ngay cả khi bạn không chắc chắn rằng bạn cần phải chạy bất kỳ truy vấn cơ sở dữ liệu nào trong yêu cầu hiện tại mà ứng dụng của bạn đang phục vụ.

Nếu bạn cần buộc Bộ điều hợp kết nối với RDBMS, hãy sử dụng phương thức getConnection(). Phương thức này trả về một đối tượng cho kết nối như được đại diện bởi phần mở rộng cơ sở dữ liệu PHP tương ứng. Ví dụ, nếu bạn sử dụng bất kỳ lớp Adapter nào cho các trình điều khiển PDO, thì getConnection() trả về đối tượng PDO, sau khi khởi tạo nó như một kết nối trực tiếp đến cơ sở dữ liệu cụ thể. Có thể hữu ích khi buộc kết nối nếu bạn muốn bắt bất kỳ trường hợp ngoại lệ nào nó phát sinh do kết quả của thông tin đăng nhập tài khoản không hợp lệ hoặc không kết nối với máy chủ RDBMS khác. Những ngoại lệ này không được ném cho đến khi kết nối được tạo ra, vì vậy nó có thể giúp đơn giản hóa mã ứng dụng của bạn nếu bạn xử lý các ngoại lệ ở một nơi, thay vì tại thời điểm truy vấn đầu tiên đối với cơ sở dữ liệu.

Ngoài ra, bộ điều hợp có thể được đăng theo thứ tự để lưu trữ, ví dụ: trong biến phiên. Điều này có thể rất hữu ích không chỉ cho chính bộ điều hợp, mà còn cho các đối tượng khác tổng hợp nó, giống như đối tượng Zend_Db_Select. Theo mặc định, bộ điều hợp được phép được tuần tự hóa, nếu bạn không muốn nó, bạn nên xem xét việc chuyển tùy chọn Zend_Db :: ALLOW_SERIALIZATION bằng FALSE, xem ví dụ trên. Để tôn trọng các nguyên tắc kết nối lười biếng, bộ điều hợp sẽ không kết nối lại chính nó sau khi được unserialized. Sau đó, bạn phải gọi getConnection(). Bạn có thể làm cho bộ điều hợp tự động kết nối lại bằng cách truyền Zend_Db :: AUTO_RECONNECT_ON_UNSERIALIZE với TRUE làm tùy chọn bộ điều hợp.

Đóng một kết nối

Thông thường nó không phải là cần thiết để đóng một kết nối cơ sở dữ liệu. PHP tự động dọn sạch tất cả các tài nguyên và kết thúc một yêu cầu. Các phần mở rộng cơ sở dữ liệu được thiết kế để đóng kết nối khi tham chiếu đến đối tượng tài nguyên được làm sạch.

Tuy nhiên, nếu bạn có một tập lệnh PHP dài hạn khởi tạo nhiều kết nối cơ sở dữ liệu, bạn có thể cần phải đóng kết nối, để tránh làm cạn kiệt dung lượng của máy chủ RDBMS của bạn. Bạn có thể sử dụng phương thức closeConnection() của Adapter để đóng một cách rõ ràng kết nối cơ sở dữ liệu bên dưới.

Kể từ khi phát hành 1.7.2, bạn có thể kiểm tra bạn hiện đang kết nối với máy chủ RDBMS với phương thức isConnected(). Điều này có nghĩa là tài nguyên kết nối đã được khởi tạo và không bị đóng. Chức năng này hiện không thể kiểm tra ví dụ như đóng một phía máy chủ của kết nối. Đây là nội bộ sử dụng để đóng kết nối. Nó cho phép bạn đóng kết nối nhiều lần mà không có lỗi. Nó đã được các trường hợp trước khi 1.7.2 cho PDO adapter nhưng không cho những người khác.

More information

Các vấn đề liên quan