我目前正在玩Play框架,作为数据库,我想使用Couchbase 4.5(目前处于测试阶段,但应该不是问题)。
这是我的问题:在 Couchbase 文档中,他们建议只使用一个 CoucbaseCluster 实例和一个 Bucket 实例。但是,如何在启动时建立这些实例并在所有控制器中全局使用它们。到目前为止,我已经知道我必须使用依赖注入,但我不知道如何实现这一点。
现在等一下,通过写这篇文章,我意识到具有这些实例的某种全局对象是老派的。我必须将这些实例注入到应该使用它们的所有控制器中,对吗?
任何帮助将不胜感激!
所以,经过一番修补,我让它工作了:
我用我的存储桶创建了一个单例类
@Singleton
class CouchbaseConnectionPool @Inject() (appLifecycle: ApplicationLifecycle){
val cluster=CouchbaseCluster.create("127.0.0.1")
val dataBucket=cluster.openBucket("data")
val fileBucket=cluster.openBucket("files")
appLifecycle.addStopHook { () =>
cluster.disconnect()
Future.successful(())
}
}
控制器看起来像这样
class DirectDBAccess @Inject() (pool:CouchbaseConnectionPool) extends Controller {
def listAll(dbtype:String) = Action {
val result:N1qlQueryResult = pool.dataBucket.query(N1qlQuery.simple("select bucket.* from bucket where type=""+dbtype+"""))
val data=result.allRows().mkString(",")
val total=result.allRows().length
val response="{data:["+data+"],total:"+total+"}"
Ok(response).as("application/json")
}
}
最后将它们全部绑定在一起,我添加了
bind(classOf[CouchbaseConnectionPool]).asEagerSingleton()
到模块.scala,它可以工作!