如果Mongo类被实例化两次会有问题吗?

时间:2012-09-07 15:16:25

标签: mongodb symfony symfony-2.1 doctrine-odm

我想使用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对象的引用而不涉及循环引用的任何想法?

1 个答案:

答案 0 :(得分:1)

Mongo的每个实例都代表与群集的单独网络连接。文档建议仅对整个应用程序使用单个实例。

当您经常创建新的Mongo实例时,每个实例必须首先建立新连接,这将花费相当长的时间。但重用旧实例意味着将使用已经开放的网络连接,这要快得多。

使用多个实例的另一个缺点是MongoDB保证通过每个连接发送的所有查询按顺序处理,但不保证来自不同连接的查询相同。因此,当您首次创建文档然后使用相同的连接删除它时,您可以确定它已经消失。但是当你通过Mongo A创建它然后通过Mongo B删除它时,可能会在删除后处理保存并且对象将保留在数据库中。