为什么与Casbah有多个mongodb连接?

时间:2014-09-13 16:06:15

标签: mongodb scala casbah

我必须使用casbah scala客户端管理与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"

    }

然后我有另一个扩展AbstractMongoDao

的类
class MongoDAO (override val config : Config)
  extends AbstractMongoDAO(config) with Serializable

我使用这个简单的代码获得数据库连接。 appName是一个变量数据库。

val _db = db(appName)

我做错了什么?

1 个答案:

答案 0 :(得分:4)

Casbah建立在官方Java driver之上。 MongoClient表示与MongoDB集群的数据库连接的内部池。如果您使用相同的群集并且只更改数据库名称而不是主机,则不需要创建多个MongoClient,一个就足以满足整个应用程序的需要。

配置MongoClient支票this文档和相应的options。如果您有多个数据库主机或仍想使用多个MongoClient,那么您可以构建选项并创建MongoClient,如下所示:

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

 val _mongoClient = MongoClient(host, options)

在您的情况下,由于只需要更改数据库名称而不是数据库主机,我会将获取数据库的方法更改为:

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

你不再需要地图了。