afMongo的MongoClient的生命周期应该是什么?

时间:2014-08-15 22:15:10

标签: mongodb fantom afbedsheet

基于afMongo example我目前正在做的事情:

mongoClient := MongoClient(ActorPool(), `mongodb://localhost:27017`)
collection  := mongoClient.db("mydb").collection("mycollection")
...
// inserts or queries here
...
mongoClient.shutdown

我的理解是MongoClient使用池连接。如果这是正确的,那么我相信我可以跨所有DAO共享MongoClient,只在afBedSheet应用程序关闭时关闭它。

  1. 这个假设是否正确?
  2. 我怎样才能将MongoClient关闭挂钩到afBedSheet关闭?

1 个答案:

答案 0 :(得分:1)

  1. 是。您只需要一个MongoClient
  2. 使用RegistryShutdown服务。当BedSheet关闭时,它也会关闭IoC注册表。
  3. 我会将ConnectionManager作为服务,并将其关闭。所以在AppModule

    @Build
    static ConnectionManager buildConnectionManager() {
        ConnectionManagerPooled(ActorPool(), `mongodb://localhost:27017`)
    }
    
    @Contribute { serviceType=RegistryShutdown# }
    static Void contributeRegistryShutdown(Configuration config, ConnectionManager conMgr) {
        config.add(|->| { conMgr.shutdown } )
    }
    

    MongoClient也可以是服务。

    您还可以将上述内容重写为更多,嗯,正确。我倾向于使用ActorPools服务来密切关注它们。

    static Void bind(ServiceBinder binder) {
        binder.bind(MongoClient#)
    }
    
    @Build { serviceId="afMongo::ConnectionManager" }
    static ConnectionManager buildConnectionManager(ConfigSource configSrc, ActorPools actorPools) {
        actorPool := actorPools.get("myPod.connectionManager")
        return ConnectionManagerPooled(actorPool , `mongodb://localhost:27017`)
    }
    
    @Contribute { serviceType=ActorPools# }
    static Void contributeActorPools(Configuration config) {
        config["myPod.connectionManager"] = ActorPool() { it.name = "myPod.connectionManager"; it.maxThreads = 1 }
    }
    
    @Contribute { serviceType=RegistryShutdown# }
    static Void contributeRegistryShutdown(Configuration config, ConnectionManager conMgr) {
        config["myPod.closeConnections"] = |->| {
            conMgr.shutdown
        }
    }
    

    myPod.closeConnections只是一个任意名称,在示例中它不会在其他任何地方使用。

    但是你可以使用它来覆盖或删除贡献。某些未来的测试场景可能会添加MyTestAppModule以下内容:

    @Contribute { serviceType=RegistryShutdown# }
    static Void contributeRegistryShutdown(Configuration config) {
        config.remove("myPod.closeConnections")
    }
    

    在这个特定的例子中可能没什么用处,但知道的有用。