1

基于afMongo 示例,我目前正在这样做:

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 关闭?
4

1 回答 1

1
  1. 是的。你只需要一个MongoClient
  2. 使用RegistryShutdown服务。当 BedSheet 关闭时,它也会关闭 IoC 注册表。

我会将其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")
}

在这种特定情况下可能没有用,但了解一下很有用。

于 2014-08-16T10:42:13.993 回答