2012-03-29 12 views
6

Ich habe versucht, "guten Code" zu schreiben und Dependency Injection zu verwenden, um Datenbankobjekte in den Konstruktoren meiner Klassen zu übergeben.Caching von MongoDB-Objekten in PHP

Konstrukteurs nehmen im Allgemeinen die folgende Form:

public function __construct(MongoDB $db) { 
    $this->collection = $db->collectionName; 
} 

Ich habe bemerkt, dass für jedes Objekt erstellt, ein neueMongoCollection erstellt wird. (Das heißt den Zugriff auf den $db->collectionNameEigenschaft zweimal gibt zwei verschiedene Objekte, nicht das gleiche Objekt)

Ich habe eine Active Stil Basisklasse wurde unter Verwendung, so dass Objekte sind in der Lage, sich selbst CRUD.

Jetzt, wenn ich eine Art von getAllRecords() Funktion verwende, und 100s dieser Objekte zurückgeben, werden 100s MongoCollection Objekte erstellt. (Ein kurzer Blick auf die Treiberquelle scheint darauf hinzuweisen, dass auch dort neue Objekte erstellt werden, nicht nur neue Darstellungen in PHP)

Ich habe das erreicht, indem ich sowohl Mongo als auch MongoDB Klassen implementiert habe, um Caching zu implementieren.

class MyMongo extends Mongo 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MyMongoDB($this, $name); 
    } 
} 

class MyMongoDB extends MongoDB 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MongoCollection($this, $name); 
    } 
} 

Meine Fragen sind wie folgt:

  • dieses Verhalten von MongoDB gedacht? Sollte es wirklich jedes Mal ein neues Objekt zurückgeben, oder ist es ein Bug/Feature im PHP Treiber oder Mongo selbst (gibt es einen Anwendungsfall für 2 Objekte für die gleiche Sammlung?)
  • Werde ich Probleme verursachen Ich selbst, indem Sie entweder MongoDB und MongoCollection Objekte, die erstellt werden, und sie wiederverwenden.
  • Wie gehen andere Personen normalerweise mit MongoDB um? Sollte ich einen völlig anderen Ansatz verwenden? (D DataMapper)

Danke,

Leigh.

Antwort

2

Es ist beabsichtigt, da Sammlungen haben andere Eigenschaften als ihre Namen zugeordnet (w und wtimeout im Moment, mehr für die Zukunft geplant). Wenn Sie nur auf die Namen achten, ist es in Ordnung, sie zu cachen.

+0

Danke @kristina, ich denke, dass alle Änderungen, die ich an w oder wtimeout vornehmen müsste, über alle Sammlungen hinweg gleich sein würden, daher scheint es nur der Name der Sammlung zu sein, die mir wichtig ist. Darf ich fragen, wie Sie Ihre Datenobjekte normalerweise verwalten? Verwenden Sie ActiveRecord, DataMapper, etwas anderes oder einfach nur das, was am besten passt? – Leigh

+0

Ich habe den Treiber geschrieben, daher ist mein Wissen meist theoretisch. Benutzer mit mehr praktischer Erfahrung sind wahrscheinlich besser qualifiziert, den dritten Teil Ihrer Frage zu beantworten. – kristina

+0

Ich weiß, dass du den Treiber geschrieben hast, deshalb belästige ich dich;) - Aber TY für deine Zeit, ich weiß, es gibt ein paar Leute im PHP-Chat, die Mongo benutzen, ich werde sie gehen lassen. – Leigh

1

Ich habe die MongoCollection in meine Objekte anstelle der MongoDb übergeben. Meine Argumentation war, dass die Auswahl der Sammlung im Objekt eine versteckte Abhängigkeit wäre (möglicherweise ein Overkill), und dann kann ich in meinen Komponententests das Objekt MongoCollection verspotten.

+0

Meine Konstruktoren haben tatsächlich "parent :: __ construct ($ db-> collection)" in ihnen.* Meine Argumentation * war, dass ein Objekt in Ordnung ist, wenn man weiß, was seine eigene Sammlung ist, und ich wollte nicht 100er Sammlungen außerhalb des Objekts verfolgen müssen. – Leigh