2012-09-07 3 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이 반환됩니다. 그래서 저는 방금 Mongo의 인스턴스를 인스턴스화하여 잘 작동했습니다 :

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

거기에 문제가있을 수 있습니까? 나는 doctrine을 의미하며 세션 핸들러는 \Mongo이라는 두 개의 다른 인스턴스를 사용할 것입니다.

\Mongo 개체에 대한 참조를 순환 참조로 떨어지지 않고 doctrine에서 생성하는 방법에 대한 아이디어가 있습니까?

답변

1

모든 Mongo 인스턴스는 클러스터에 대한 별도의 네트워크 연결을 나타냅니다. 문서에서는 전체 응용 프로그램에 대해 단일 인스턴스 만 사용하는 것이 좋습니다.

새로운 Mongo 인스턴스를 자주 만들면 각 인스턴스가 먼저 새로운 연결을 설정해야하는데 상당한 시간이 걸립니다. 그러나 오래된 인스턴스를 재사용한다는 것은 이미 열려있는 네트워크 연결이 사용된다는 것을 의미합니다. 이는 훨씬 빠릅니다.

다중 인스턴스를 사용하는 또 다른 단점은 MongoDB가 연결 연결을 통해 보내는 모든 쿼리가 순서대로 처리되지만 다른 연결에서 오는 쿼리에 대해 동일한 보장을하지 않는다는 것입니다. 따라서 처음 문서를 만든 다음 동일한 연결로 문서를 삭제하면 문서가 사라 졌는지 확인할 수 있습니다. 그러나 Mongo A를 통해 Mongo A를 통해 생성 한 다음 Mongo B를 통해 삭제하면 제거 후 저장이 처리되고 객체가 데이터베이스에 남을 수 있습니다.