2014-12-18 5 views
-2

PHPOO를 사용하여 DB 연결을 만드는 더 좋은 방법을 알고 싶습니다. 내가 __destruct에 __construct 에 연결과 밀접한 관계를 설정하면더 나은 데이터베이스 연결 방법

, 나는 너무 많은 쓸모없는 연결을하지 않을까요? 예를 들어

는 내 클래스

$myObj = new sqlClass(); // mysql_connect and mysql_close executed here... 

$myObj->insertData(); // mysql_connect and mysql_close executed here again... 

는 내가 연결이 분리 설정해야합니다 ...

그래서 ..이의이 클래스의 인스턴스를하자 .. "sqlClass"라고 그것은 몇 가지 방법을 가지고 있습니다 ..?

+0

을 'mysql_ *'함수! 대신 PDO/MySQLi를 사용하십시오. OO를 사용하여 DB 연결을 사용하려는 경우 동일한 DB 연결을 사용하고 있는지 확인하십시오. 객체 지향 접근 방식으로 DB 연결을 감싸고 자한다면 많은 부분을 고려해야한다. – Raptor

+2

모든 애플리케이션에 적합한 대답은 없습니다. 데이터베이스와의 상호 작용과 관련하여 응용 프로그램의 동작을 조사하고이를 기반으로 솔루션을 결정해야합니다. – sn00k4h

답변

1

한 못을 박았다 연결

class sqlClass { 
    private $_connection = null; 
    public function __construct() { 
     $this->_connection = new SomeConnection(array('param1', 'param2', 'param3')); 
     } 
    public function query($query) { 
     return $this->_connection->query(); 
     } 
    } 

이 추가 더 많은 자유를하자

class sqlClass { 
    private $_connection = null; 
    public function __construct($params) { 
     $this->_connection = new SomeConnection($params); 
     } 
    public function query($query) { 
     return $this->_connection->query(); 
     } 
    } 

3.1 게으름 추가하기

class sqlClass { 
    private $_connection = null; 
    private $_params = null; 
    public function __construct($params) { 
     $this->_params = $params 
     } 
    public function query($query) { 
     if ($this->_connection === null) 
      $this->_connection = new SomeConnection($this->_params); 
     return $this->_connection->query($query); 
     } 
    } 
(210)

3.2 중 연결 클래스에 의존성 주입

class sqlClass { 
    private $_connection = null; 
    public function __construct(SomeConnection $connection) { 
     $this->_connection = $connection; 
     } 
    public function query($query) { 
     return $this->_connection->query($query); 
     } 
    } 

4 이동 lazyness을 추가하고 OOP와 의존성 주입

class LazyConnection extends SomeConnection{ 
    private $_params = null; 
    private $_inited = false; 
    public function __construct($params){ 
     $this->_params = $params; 
     } 

    public function query($query){ 
     if (!$this->_inited){ 
      parent::__construct($this->_params); 
      $this->_inited = true; 
      } 
     parent::query($query); 
     } 
    } 

을 사용하여 수동으로 연결을 닫을 필요가 없습니다 : 사용되지는 사용하지 마십시오 http://php.net/manual/en/features.gc.php

0

가능한 한 늦게 연결을 열어야합니다. 드라이버가 연결 풀링을 사용하는 경우 연결을 다시 사용합니다. 코드가 어떤 이유로 실패하거나 데이터를 삽입하는 부분에 절대 도달하지 않으면 연결이 누출되지 않습니다. 엄지 손가락의 규칙으로

, 후반을 열 조기을 닫고 드라이버가 나머지

+0

항상 일찍 닫고 싶지는 않습니다. 때로는 지속적인 연결을 유지하고 전혀 연결을 닫지 않을 수도 있습니다. 예를 들어 쿼리를 자주 실행하는 프로세스가 거의없는 경우 연결 설정이 오버 헤드가됩니다. – sn00k4h

+0

나는 운전자가 연결 풀을 다루는 것보다 더 나은 일을 할 것이라고 내기하겠다 :) 여기에 같은 문제에 관한 이전 토론 (6 년 전)이있다. http://stackoverflow.com/questions/312702/is 데이터베이스 연결을 유지하기가 쉽지만 오랜 기간 공개 된 의견은 다양하지만 스케일링 및 안정성 문제를 처리해야하는 상업용 애플리케이션을 많이 구축했기 때문에 늦어도 일찍 닫고 운전사는 그 일을한다. – Born2Code

관련 문제