Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么有多个mongodb和Casbah有联系?_Mongodb_Scala_Casbah - Fatal编程技术网

为什么有多个mongodb和Casbah有联系?

为什么有多个mongodb和Casbah有联系?,mongodb,scala,casbah,Mongodb,Scala,Casbah,我必须使用casbah scala客户端管理到MongoDb的多个数据库连接。我有一个近似值,可以工作,但可以打开数百个连接。 我想保存一个Map[String,MongoDB],它为每个数据库保存一个连接(这是关键。我在带有两个节点群集的Spark Streaming中使用它,所以我认为这是一个序列化问题,但我不知道如何修复它 看看我的课 abstract class AbstractMongoDAO(@transient val config: Config) extends Closeab

我必须使用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
我用这个简单的代码获得了一个db连接。appName是一个变量数据库

val _db = db(appName)

我做错了什么?

Casbah构建在official之上。
MongoClient
表示到MongoDB集群的一个内部db连接池。如果使用同一集群,只更改数据库名称而不更改主机,则不需要创建多个
MongoClient
,一个就足够整个应用程序使用

要配置
MongoClient
请查看文档和相应的文档。如果您有多个DB主机,或者仍然希望使用多个
MongoClient
s,则可以构建选项并创建
MongoClient
,如下所示:

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

 val _mongoClient = MongoClient(host, options)
在您的情况下,因为只有db名称需要更改,而不是db主机,所以我将更改将db设置为以下的方法:

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

你不再需要地图了。

我按照你说的做了,但仍然创建了多个连接…我将连接与你的mongoclientoptions放在一个伴生对象中,现在可以正常工作了。谢谢。