2010-07-04 2 views
7

저는 4 세 이상의 프로 시저 프로그래머 였으므로 OOP를 살펴보아야 할 때입니다. 그 말로는, 내가 수업에서 두 ​​가지 방법을 호출해야한다고 가정 해 봅시다. 각 방법은 DB에 대한 연결을 필요로하므로 DB에 대한 두 번 트립이 발생하여 여러 연결이 열립니다. 응용 프로그램 계층 (생성자)에서 일종의 코드를 사용하거나 DB 측에서 연결 풀을 설정해야합니까? 그리고 킥을 위해서, 나는 mysql을 사용하지 않는다. 나는 codeigniter와 함께 mongodb를 사용하고있다.OOP로 DB에 여러 연결을 여는 것을 피하는 방법 PHP

내가 지금까지 가지고 있는게있어, 사용하기에 이상적인가요? 내가 설정 내 DB 정보 곳

은 다음과 같습니다

database_conn.php

class Database_Conn extends Model { 

    function _connect() { 
     $m = new Mongo("localhost:27017", array("persist"=>"x")); 
     $db = $m->selectDB("foo"); 
     return $db; 
    }  
}  

샘플 모델 파일이

class Home_model extends Model { 

    public function __construct() { 
     // Establish connection to "profiles" table 
     $this->db_conn = Database_Conn::_connect()->selectCollection("profiles"); 
    } 

    function getMyProfile($username) { 
     $data = $this->db_conn->findOne(array("username" => $username)); 
     return $data; 
    } 

    function getAll() { 
     $data = $this->db_conn->find(); 
     return $data; 
    } 
} 

답변

6

당신이 사용해야 singleton pattern

EDIT : 그런 식으로 _connect를 여러 번 호출 할 수 있습니다. 다시 연결해야합니다.

싱글 톤 구현은 일반적으로 생성자를 private/protected로 설정하고 첫 번째 호출에서 연결을 만들고 나중에 호출 할 때 생성 된 연결을 반환하는 getInstance 메서드를 정의해야한다는 것을 의미합니다.

이 내가 할 것이 무엇인가 : 다음

class Database_Conn extends Model { 

    static protected $_instance; 

    protected $db = null; 

    final protected function __construct() { 
     $m = new Mongo("localhost:27017", array("persist"=>"x")); 
     $this->db = $m->selectDB("foo"); 
    } 

    static public function getInstance() { 
     if (!(self::$_instance instanceof self)) { 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function getConnection() { 
     return $this->db; 
    } 

    final protected function __clone() { } 
} 

와 연결 개체를 얻을 수 Database_Conn::getInstance()->getConnection()를 사용합니다.

+0

최종적으로 확장해야하는 앱에는 좋지 않다고 생각했습니다. – luckytaxi

+0

싱글 톤은 정확히 한 번 인스턴스화 된 객체를 만드는 방법입니다. 확장 성을 어떻게 줄일 수 있습니까? 말해주세요) –

+0

죄송합니다. 다른 것을 생각하고있었습니다 (묻지 않음). 네가하는 말을 이해한다. 나는 지금 그 일을하고있다. 위의 코드를 살펴보십시오. 감사. – luckytaxi

6

db 연결에 대한 관리자 클래스를 조사해야합니다. 그런 다음 연결을 요청하는 중앙 위치를 가질 수 있습니다. 이미 열려있는 연결이있는 경우 관리자는 새 연결을 반환하는 대신이를 반환 할 수 있습니다.

이것은 하나의 접근 방법입니다. 이와 비슷한 것을 구현하는 방법에 대한 많은 예제가 있습니다. 이미 mysql과 mssql을위한 것입니다. 하지만 당신은 확실히 당신의 DB를 확장 할 수 있습니다.

+0

이것은 kgb가 보여준 것에 익숙한 것 같은데, 그렇지 않습니까? – luckytaxi

+0

있습니다. 그러나 우리가 올 때 볼 때 그들은 동시에 맞습니다. 그는 또한 더 많은 것을 포함하기 위해 편집을했지만. – spinon

+0

아무런 문제가 없다는 것을 알았지 만 개념을 올바르게 이해하고 있는지 확인하고 싶었습니다. 다시 한 번 감사드립니다! – luckytaxi

1

데이터베이스 계층을 사용하십시오. Dibi는이 경우 훌륭한 도서관입니다. http://dibiphp.com

관련 문제