gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:00:50 24 4
gpt4 key购买 nike

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

我做错了什么?

最佳答案

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

而且您不再需要 map 。

关于mongodb - 为什么多个 mongodb 连接与 Casbah?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com