2015-04-26 3 views
1

Я использую монго с игровым фреймворком с помощью «reactivemongo», который создает асинхронный мост между монго-соединением и программой. Для автономных проектов я всегда использую casbah lib - он имеет более собственный синтаксис (иногда использование фьючерсов в каждом запросе не требуется, и моя религия не позволяет мне использовать Async.await для блокировки каждого запроса) для меня и не для наставников, также мне не нравится накладные расходы JSON BSON.play framework with mongodb

Но использование casbah в игровом каркасе прямолинейно (просто создайте соединение Mongo в контроллере) создает утечки соединений - это означает, что вы должны создать пул соединений и управлять собой, другие слова пишите повторно.

Кто-нибудь использовал casbah с монго в производстве? Где лучший и самый канонический способ создания и контроля связи в игровой экосистеме?

ответ

0

Нет необходимости использовать Async.wait с реактивным монго (и вы все равно не должны).

+1

Не могли бы вы немного поработать над своим ответом? Для хорошего ответа это слишком короткое, недостаточно информативное. Например. ** что ** вы предлагаете вместо Async.wait? ** Почему ** нет необходимости? – ZygD

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, так как он также может использовать библиотеку JSON для воспроизведения. Если вы берете данные из базы данных и загружаете их через REST api, это более удобный вариант.

2

Сначала вы должны проверить Connecting to MongoDB. Теперь перейдите в этот учебник (Если вы использовали другой редактор, то выполните шаги создания проекта Scala).

Теперь проверьте это следующие шаги:

1>projectName/conf/application.conf добавить application.conf Монго имени 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> Создайте файл .scala в папке controller, укажите любое имя для 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 в контроллере, где вы хотите использовать соединение Монго. Напр. Я создал файл checkConnection.scala и содержит

import com.cloudinsights.scala.controllers. { 
    ScalaMongoFactory 
} 
object checkConnection { 
    val collection = ScalaMongoFactory.database("your collectionName") 
} 
Смежные вопросы