【问题标题】:Why multiple mongodb connecions with Casbah?为什么与 Casbah 有多个 mongodb 连接?
【发布时间】:2014-09-13 16:06:15
【问题描述】:

我必须使用 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)

我做错了什么?

【问题讨论】:

    标签: mongodb scala casbah


    【解决方案1】:

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

    要配置MongoClient,请查看this 文档和相应的options。如果您有多个数据库主机或仍想使用多个 MongoClients,那么您可以构建您的选项并创建 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
    

    而且你不再需要地图了。

    【讨论】:

    • 我按照你说的做了,但仍然创建了多个连接...我将连接与你的 mongoclientoptions 放在一个伴随对象中,现在可以正常工作。谢谢。
    猜你喜欢
    • 2011-07-18
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2012-10-06
    • 2017-11-30
    • 2020-04-08
    • 2015-09-06
    相关资源
    最近更新 更多