【问题标题】:play framework with mongodb用mongodb玩框架
【发布时间】:2015-04-26 08:50:01
【问题描述】:

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

但是在 play framework 中直接使用 casbah(只需在控制器中创建 Mongo 连接)会产生连接泄漏 - 这意味着您应该创建连接池并自己控制,或者编写 reactivemongo。

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

【问题讨论】:

    标签: mongodb scala playframework playframework-2.3 casbah


    【解决方案1】:

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

    现在检查以下步骤:

    1> projectName/conf/application.conf add 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> 现在在你想使用 mongo 连接的控制器中创建一个新的 .scala 文件。例如。我创建了 checkConnection.scala 文件并包含类似

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

    【讨论】:

      【解决方案2】:

      没有必要将 Async.wait 与响应式 mongo 一起使用(而且你也不应该这样做)。

      【讨论】:

      • 您能否在答案上多做一些工作?对于一个好的答案,这太短了,没有足够的信息。例如。 什么你建议而不是 Async.wait? 为什么不需要?
      【解决方案3】:

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

      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 提供数据,这是一个更好的选择。

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多