2014-09-13 2 views
2

나는 casbah scala 클라이언트를 사용하여 MongoDb에 여러 데이터베이스 연결을 관리해야한다. 나는 근사치가 이지만 수백 개의 연결을 열었습니다.왜 Casbah와 여러 개의 mongodb 연결이 필요합니까?

키가되는 각 데이터베이스에 대한 연결을 저장하는 Map [String, MongoDB]을 저장하려고합니다. 두 개의 노드 클러스터가 포함 된 Spark Streaming에서 이것을 사용하고 있습니다. 따라서 라고 생각합니다. 직렬화 문제가 있지만.

내 클래스에 봐. 그것을를 해결하는 방법을

abstract class AbstractMongoDAO(@transient val config: Config) extends Closeable with Serializable { 

     @transient private val mongoConfig = config.getConfig(CONFIG_KEY) 
     private val host = mongoConfig.getString(CONFIG_KEY_HOST) 

     @transient private var _mongoClient: MongoClient = MongoClient(host) 
     private var _dbs: mutable.HashMap[String, MongoDB] = mutable.HashMap() 

     protected def dbs(): mutable.HashMap[String, MongoDB] ={ 
     if(_dbs == null) 
      _dbs = mutable.HashMap() 
     _dbs 
     } 

     def mongoClient: MongoClient = { 
     if (_mongoClient == null) { 
      _mongoClient = MongoClient(host) 
     } 
     _mongoClient 
     } 

     def db(dbName: String):MongoDB = { 
     if (dbs.get(dbName) == None) { 
      _dbs += (dbName -> mongoClient.getDB(dbName)) 
     } 
     _dbs.get(dbName).get 
     } 

     override def close() = { 
     Option(_mongoClient).foreach(_.close()) 
     } 

    } 

    private object AbstractMongoDAO { 
     val CONFIG_KEY = "mongo" 
     val CONFIG_KEY_HOST = "host" 

    } 

을 모른다 그리고 나는

class MongoDAO (override val config : Config) 
    extends AbstractMongoDAO(config) with Serializable 
AbstractMongoDao를 확장하는 다른 클래스를

그리고이 간단한 코드로 db 연결을 얻습니다. appName은 변수 데이터베이스입니다.

val _db = db(appName) 

내가 뭘 잘못하고있어?

답변

4

카스바는 공식 Java driver 위에 만들어졌습니다. MongoClient은 MongoDB 클러스터에 대한 DB 연결의 내부 풀을 나타냅니다. 동일한 클러스터를 사용하고 호스트가 아닌 데이터베이스 이름 만 변경하면 MongoClient을 여러 개 만들 필요가 없으므로 전체 응용 프로그램에 충분합니다.

MongoClient을 확인하려면 this 설명서와 해당 options을 구성하십시오. 여러 DB 호스트이 있거나 여전히 옵션을 구축하고이 같은 MongoClient 만들 수 있습니다 후 여러 MongoClient의를 사용하려는 경우에만 DB 이름 변경 neeeds하고 있기 때문에 귀하의 경우에는

val options = MongoClientOptions.builder() 
      .connectionsPerHost(1) 
      // add other options if needed 
      .build(); 

val _mongoClient = MongoClient(host, options) 

을하지 DB 호스트 나는 것 db를 얻는 방법을 다음과 같이 변경하십시오.

def db(dbName: String):MongoDB = 
    mongoClient.getDB(dbName) // db will be created in Mongo on the fly if not exist 

그리고 더 이상지도가 필요하지 않습니다.

+1

나는 당신이 말한대로했지만 여전히 여러 개의 연결을 만듭니다 ... 나는 당신의 mongoclientoptions와 함께 동반자 개체에 연결을 넣었고 이제는 올바르게 작동합니다. 고맙습니다. – gasparms