Кэширование объектов 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
. Мое рассуждение состояло в том, что выбор коллекции в объекте будет скрытой зависимостью (может быть излишним), а затем в моих модульных тестах я могу издеваться над