Как постараться не открывать многочисленные связи для DB с ООП PHP

Я был процедурным программистом больше 4 лет, и пора начать изучать ООП. После этих слов скажем, я должен был назвать два метода в своем классе. Каждый метод требует соединения с DB, таким образом, это - два прохождения в DB, который также открывает многочисленные связи. Этого можно избежать при наличии своего рода кода на прикладном уровне (конструктор?) или пул соединения должен быть установкой на стороне DB? И только для ударов, я не использую mysql; я использую mongodb с codeigniter.

Вот то, что я имею до сих пор, не уверенный, если это идеально для использования?

Вот то, где я устанавливаю свою информацию о 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;
    }
}
7
задан erisco 5 July 2010 в 07:22
поделиться

3 ответа

вы должны использовать одноэлементный шаблон

РЕДАКТИРОВАТЬ: как вы это сделали, _connect можно вызывать несколько раз, что означает повторное подключение.

Одноэлементная реализация обычно означает, что вам нужно сделать конструктор закрытым / защищенным и определить метод 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 () , чтобы получить объект подключения.

6
ответ дан 6 December 2019 в 19:32
поделиться

Вам следует изучить класс менеджера для ваших соединений с базой данных. Тогда у вас может быть одно центральное место, откуда вы запрашиваете соединения. Если уже существует открытое соединение, менеджер может вернуть его вместо возврата нового соединения.

Это был бы один из подходов. Существует масса примеров того, как реализовать что-то подобное. Уже есть некоторые для mysql и mssql. Но вы наверняка могли бы продлить свой db.

6
ответ дан 6 December 2019 в 19:32
поделиться

Используйте слой базы данных. Dibi - отличная библиотека в этом случае. http://dibiphp.com

1
ответ дан 6 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: