与mongodb一起玩框架

时间:2015-04-26 08:50:02

标签: mongodb scala playframework playframework-2.3 casbah

我正在使用带有“reactivemongo”的播放框架的mongo,这在mongo连接和programm之间建立了异步桥接。对于独立项目,我总是使用casbah lib - 它有更多的本机语法(有时在每个请求中使用Futures,而且我的宗教信仰不允许我使用Async.await来阻止每个请求)对我来说没有演员开销,我也不喜欢JSON BSON转换开销。

但是在播放框架中使用casbah直接方式(只是在控制器中创建Mongo连接)会产生连接泄漏 - 这意味着你应该创建连接池并自己控制,其他词写为reactivemongo。

有没有人在生产中使用过mongo的casbah?在游戏生态系统中创建和控制连接的最佳和最规范的方式在哪里?

3 个答案:

答案 0 :(得分:2)

首先,您应该检查 Connecting to MongoDB 。现在转到本教程create scala project(如果您使用其他编辑器,则遵循scala项目创建步骤)。

现在检查以下步骤:

1> projectName/conf/application.conf添加application.conf mongo Db名称,集合名称,端口号,URL等play reactive mongo例如:我在application.conf

中添加了以下内容
mongodb.default.host = "localhost"
mongodb.default.db = "Demo"
mongodb.default.port = "27017"
CI.default.uri = "mongodb://localhost:27017/"

2 - ;在controller文件夹中创建一个.scala文件,为ex提供任何名称。我将文件名设置为ScalaMongoFactory,并在此文件中添加以下代码

import com.mongodb.casbah. {
  MongoClient, MongoClientURI
}
import com.typesafe.config.ConfigFactory
object ScalaMongoFactory {
  private val config = ConfigFactory.load()
  private val DATABASE = config.getString("mongodb.default.db")
  private val server = MongoClientURI(config.getString("CI.default.uri"))
  private val client = MongoClient(server)
  val database = client(DATABASE)
}

3>现在在控制器中创建一个新的.scala文件,您要在其中使用mongo连接。对于前者我创建了checkConnection.scala文件并包含类似

import com.cloudinsights.scala.controllers. {
  ScalaMongoFactory
}
object checkConnection {
  val collection = ScalaMongoFactory.database("your collectionName")
}

答案 1 :(得分:0)

没有必要将Async.wait与反应性mongo一起使用(反正你也不应该这样做。)

答案 2 :(得分:0)

我猜您可以使用实用程序对象来管理您的连接。

import com.mongodb.casbah.{MongoClient, MongoDB}
import play.api.Play

object MongoManager {
    private val server = Play.current.configuration.getString("db.host").get
    private val port = Play.current.configuration.getInt("db.port").get

    object using {
        def apply[A](col: String)(block: MongoDB => A): A = {
            val con = MongoClient(server, port)
            val a = block(con.apply(col))
            con.close
            a
        }
        def apply[A](block: MongoClient => A): A = {
            val con = MongoClient(server, port)
            val a = block(con)
            con.close
            a
        }
    }

    object stashed {
        private lazy val con = MongoClient(server, port)
        def apply(col: String): MongoDB = con.apply(col)
        def apply: MongoClient = con
    }
}

我找不到这个驱动程序的播放插件。

我个人建议使用ReactiveMongo驱动程序,因为它也可以使用play的JSON库。如果您从数据库中获取数据并通过REST API提供数据,那么它就是一个更好的选择。