我想使用MongoDB存储会话,我需要将\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
但它抛出一个循环引用异常,因为我正在使用的logger预处理器需要我认为的request_id,即使我关闭它,有时它返回null。那么我只是实例化我自己的Mongo实例并且运行良好:
services:
mongo:
class: Mongo
arguments: [ %doctrine_mongodb.default_server% , %doctrine_mongodb.options% ]
这可能有问题吗?我的意思是学说,会话处理程序将使用两个不同的\Mongo
实例。
有关如何获取对doctrine创建的\Mongo
对象的引用而不涉及循环引用的任何想法?
答案 0 :(得分:1)
Mongo的每个实例都代表与群集的单独网络连接。文档建议仅对整个应用程序使用单个实例。
当您经常创建新的Mongo实例时,每个实例必须首先建立新连接,这将花费相当长的时间。但重用旧实例意味着将使用已经开放的网络连接,这要快得多。
使用多个实例的另一个缺点是MongoDB保证通过每个连接发送的所有查询按顺序处理,但不保证来自不同连接的查询相同。因此,当您首次创建文档然后使用相同的连接删除它时,您可以确定它已经消失。但是当你通过Mongo A创建它然后通过Mongo B删除它时,可能会在删除后处理保存并且对象将保留在数据库中。