简体   繁体   English

与mongodb一起玩框架

[英]play framework with mongodb

I am using mongo with play framework with "reactivemongo", That makes an async bridge between mongo connection and programm. 我将mongo与带有“ reactivemongo”的播放框架一起使用,这在mongo连接和编程之间建立了异步桥梁。 For standalone projects I always use casbah lib - it has more native syntax (sometimes using of Futures in each request is not needed, and my religion does not allow me to use Async.await for blocking each request ) for me and no actors overhead, also I don't like JSON BSON conversion overhead. 对于独立项目,我始终使用casbah lib-它具有更多的本机语法(有时不需要在每个请求中使用Futures,并且我的宗教信仰不允许我使用Async.await阻止每个请求),并且没有参与者的开销,我也不喜欢JSON BSON转换开销。

But using casbah in play framework direct way(just create Mongo connection in controller ) produces connection leaks - this means you should create connection pool and control yourself, otherwords write reactivemongo. 但是直接在播放框架中使用casbah(仅在controller中创建Mongo连接)会产生连接泄漏-这意味着您应该创建连接池并自己控制,否则写出reactmongo。

Has anybody used casbah with mongo in production ? 有人在生产中将casbah和mongo一起使用吗? Where is the best and most canonical way of creating and controlling connection in play ecosystem ? 在游戏生态系统中建立和控制联系的最佳,最规范的方法在哪里?

First you should check Connecting to MongoDB . 首先,您应该选中“ 连接到MongoDB” Now go to this tutorial create scala project ( If you used other editor then follow scala project creation steps ). 现在转到本教程, 创建scala项目 (如果您使用了其他编辑器,请遵循scala项目创建步骤)。

Now check this following steps : 现在检查以下步骤:

1> projectName/conf/application.conf add application.conf mongo Db name, collection name, port number, URL etc. play reactive mongo for ex: I added following in my application.conf 1> projectName/conf/application.conf添加application.conf mongo数据库名称,集合名称,端口号,URL等。例如, 播放反应性mongo :我在application.conf添加了以下内容

mongodb.default.host = "localhost"
mongodb.default.db = "Demo"
mongodb.default.port = "27017"
CI.default.uri = "mongodb://localhost:27017/"

2> Create a .scala file in controller folder give any name for ex. 2>在controller文件夹中创建一个.scala文件,为ex指定任何名称。 I set file name as ScalaMongoFactory and add following code in this file 我将文件名设置为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> Now create a new .scala file in controller where you want to use mongo connection. 3>现在,在要使用mongo连接的控制器中创建一个新的.scala文件。 For ex. 对于前。 I created checkConnection.scala file and contains like 我创建了checkConnection.scala文件,其中包含

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

无需将Async.wait与反应性mongo一起使用(无论如何,您都不应如此)。

I guess you could use a utility object to manage your connection. 我想您可以使用实用程序对象来管理您的连接。

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
    }
}

I didn't find a play plugin for this driver. 我没有找到该驱动程序的播放插件。

Personally I'd recommend using the ReactiveMongo driver instead, since it can also use play's JSON library. 我个人建议使用ReactiveMongo驱动程序,因为它也可以使用play的JSON库。 If you're taking data from the database and feeding it through a REST api, its a nicer option. 如果您要从数据库中获取数据并通过REST API馈送数据,那么它是一个更好的选择。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM