2012-09-07 22 views
0

我想使用MongoDB來存儲會話,我需要將\Mongo對象注入會話處理程序。如果Mongo類實例化了兩次,會不會有問題?

我首先想到我可以從教義像這樣的東西取,

services: 
    mongo.connection: 
     class: MongoDoctrine\MongoDB\Connection 
     factory_service: doctrine.odm.mongodb.document_manager 
     factory_method: getConnection 
    mongo: 
     class: Mongo 
     factory_service: mongo.connection 
     factory_method: getMongo 

但它拋出一個循環引用例外由於我使用的需要REQUEST_ID我覺得一個記錄器的預處理器,甚至如果我關閉它,有時它會返回null。於是我剛纔實例我自己蒙戈的實例,並運行良好:本

services: 
    mongo: 
     class: Mongo 
     arguments: [ %doctrine_mongodb.default_server% , %doctrine_mongodb.options% ] 

難道還有什麼問題嗎?我的意思是教條和會話處理程序將使用\Mongo兩個不同的實例。

有關如何獲得對由教義創建的對象的引用而不落入循環引用的任何想法?

回答

1

Mongo的每個實例都表示到集羣的單獨網絡連接。文檔建議僅爲整個應用程序使用單個實例。

當您經常創建新的Mongo實例時,每個實例必須首先建立一個新連接,這將需要相當長的時間。但重用舊實例意味着將使用已經打開的網絡連接,速度要快得多。

使用多個實例的另一個缺點是,MongoDB的保證所有查詢通過每個連接發送按序被處理,但不保證相同的用於從不同的連接來查詢。所以當你第一次創建一個文檔,然後用相同的連接刪除它時,你可以確定它已經不存在了。但是,當你通過Mongo A創建它,然後通過Mongo B刪除它時,可能會在刪除之後處理保存,並且該對象將保留在數據庫中。