2010-07-04 5 views
7

Ich bin seit mehr als 4 Jahren ein prozeduraler Programmierer und es ist Zeit, in OOP zu suchen. Sagen wir also, ich musste zwei Methoden in meiner Klasse aufrufen. Jede Methode benötigt eine Verbindung zur DB, so dass zwei Fahrten zur DB stattfinden, die auch mehrere Verbindungen öffnet. Kann dies vermieden werden, indem eine Art von Code in der Anwendungsschicht (Konstruktor?) Oder muss ein Verbindungspool auf der DB-Seite eingerichtet werden? Und nur zum Spaß, ich benutze nicht mysql; Ich benutze mongodb mit codeigniter.Wie zu vermeiden, mehrere Verbindungen zur DB mit OOP zu öffnen PHP

Hier ist, was ich bisher habe, nicht sicher, ob es ideal zu verwenden ist?

Hier ist, wo ich mein Setup DB Info:

database_conn.php

class Database_Conn extends Model { 

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

Probe Modelldatei

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

Antwort

6

sollten Sie singleton pattern verwenden

EDIT: Wie Sie es getan haben, ist es möglich, _connect mehrmals aufzurufen, was bedeutet, dass Sie erneut verbinden.

Singleton-Implementierung bedeutet normalerweise, dass Sie den Konstruktor private/protected erstellen und eine getInstance-Methode definieren müssen, die beim ersten Aufruf eine Verbindung herstellt und die erstellte Verbindung bei späteren Aufrufen zurückgibt.

das ist, was ich tun würde:

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() { } 
} 

und dann Database_Conn::getInstance()->getConnection() verwenden Sie das Verbindungsobjekt zu erhalten.

+0

Ich dachte, das ist schlecht für Apps, die irgendwann skalieren müssen? – luckytaxi

+0

Singleton ist eine Möglichkeit, ein Objekt zu erstellen, das genau einmal instanziiert wird. Wie kann es die Skalierbarkeit reduzieren? Bitte sagen Sie mir) –

+0

Sorry, ich dachte an etwas anderes (nicht fragen). Ich verstehe, was du sagst, ich denke, dass ich das jetzt tue. Schau dir meinen obigen Code an. Vielen Dank. – luckytaxi

6

Sie sollten in eine Manager-Klasse für Ihre Db-Verbindungen suchen. Dann können Sie einen zentralen Ort haben, von dem aus Sie Verbindungen anfordern. Wenn es bereits eine offene Verbindung gibt, kann der Manager diese zurückgeben, anstatt eine neue Verbindung zurückzugeben.

Dies wäre ein Ansatz. Es gibt jede Menge Beispiele dafür, wie man so etwas implementieren kann. Da gibt es schon einige für mysql und mssql. Aber Sie könnten sicherlich für Ihre dB verlängern.

+0

das klingt vertraut, was kgb gezeigt hat, nicht? – luckytaxi

+0

Es tut es. Aber wenn Sie schauen, wenn wir gepostet haben, sind sie zur gleichen Zeit. Allerdings hat er auch einen Schnitt gemacht, um mehr aufzunehmen. – spinon

+0

kein Problem, das habe ich erkannt, wollte aber sicherstellen, dass ich das Konzept richtig verstehe. Danke noch einmal! – luckytaxi

1

Verwenden Sie eine Datenbankschicht. Dibi ist in diesem Fall eine großartige Bibliothek. http://dibiphp.com

Verwandte Themen