我一直在努力編寫「良好的代碼」,並使用依賴注入在我的類的構造函數中傳遞數據庫對象。在PHP中緩存MongoDB對象
構造一般都採取這種形式:
public function __construct(MongoDB $db) {
$this->collection = $db->collectionName;
}
我注意到,每個對象創建的,創建一個新的MongoCollection
。 (即訪問$db->collectionName
屬性兩次返回兩個不同的對象,不相同的對象)
我已經使用一個ActiveRecord樣式基類,使得對象能夠CRUD自己。
現在當我使用某種getAllRecords()
函數,並返回100s這些對象時,會創建100個MongoCollection
對象。 (快速瀏覽一下驅動程序的源似乎表明正在創建的新對象有太多,在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本身的bug /功能(是否需要2個對象用於同一個集合?)
- 我會爲我自己通過緩存創建的對象
MongoDB
和MongoCollection
,並重新使用它們。 - 其他人通常如何處理MongoDB的工作?我應該完全使用不同的方法嗎? (即DataMapper的)
謝謝,
利。
感謝@kristina,我認爲對w或wtimeout所做的任何更改在所有集合中都是相同的,因此它似乎只是我關心的集合的名稱。我可以問你通常如何管理你的數據對象嗎?你使用ActiveRecord,DataMapper,還是其他的東西,或者只是看起來最適合的東西? – Leigh 2012-03-29 18:33:19
我寫的驅動程序,所以我的知識主要是理論:)具有更多實踐經驗的用戶可能更好地回答你的問題的第三部分。 – kristina 2012-03-29 19:12:48
我知道你寫了驅動程序,這就是爲什麼我會纏着你;) - 但是TY爲你的時間,我知道在PHP聊天中有一些人使用Mongo,我會去弄錯它們。 – Leigh 2012-03-29 19:15:57