Кэширование объектов MongoDB в PHP

я пытался написать "хороший код" и использовать инъекцию зависимостей для передачи объектов базы данных в конструкторах моих классов.

конструкторы обычно принимают такую форму:

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

я заметил, что для каждого созданного объекта a новая это. (т. е. доступ к $db->collectionName свойства дважды возвращает два разных объекта, а не один и тот же объект)

я использую базу стиля ActiveRecord класс, чтобы объекты могли сами себя изуродовать.

теперь, когда я использую какой-то getAllRecords() функция и возвращает 100s этих объектов, 100s объекты. (Быстрый взгляд на источник драйвера, похоже, указывает на то, что там также создаются новые объекты, а не только новые представления в PHP)

я обошел это, обернув оба Mongo и MongoDB классы для реализации кэширования.

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

мои вопросы следует:

  • это предполагаемое поведение MongoDB? Должен ли он действительно возвращать новый объект каждый раз, или это ошибка/функция в драйвере PHP или самом Mongo (есть ли прецедент для необходимости 2 объектов для одной и той же коллекции?)
  • я вызову проблемы для себя, кэшируя либо / оба MongoDB и MongoCollection объекты, которые создаются, и повторно использовать их.
  • как другие люди обычно справляются с работой с MongoDB? Должен ли я использовать a совсем другой подход? (Т. е. DataMapper)

спасибо,

ли.

2 ответов


это намеренно, так как коллекции имеют свойства, отличные от их имен, связанных с ними (w и wtimeout на данный момент, более запланированные на будущее). Если все, о чем вы заботитесь, это имена, то это нормально, чтобы кэшировать их.


Я проходил MongoCollection в мои объекты вместо MongoDb. Мое рассуждение состояло в том, что выбор коллекции в объекте будет скрытой зависимостью (может быть излишним), а затем в моих модульных тестах я могу издеваться над