ReactiveMongo:单连接池实例与多个连接池实例对多个连接池

时间:2017-08-24 10:28:27

标签: mongodb scala reactivemongo

我正在使用ReactiveMongo 0.12,并尝试了解ReactiveMongo中不同类型的连接池如何工作之间的核心差异。

ReactiveMongo似乎提供了3种与数据库建立连接的方法:

TYPE 1:使用单一连接池实例

import reactivemongo.api.MongoConnection
val driver1 = new reactivemongo.api.MongoDriver
val connection1 = driver1.connection(List("addressA", "addressB"))
val connection2 = driver1.connection(List("addressC", "addressD"))

TYPE 2:使用多个连接池实例

import reactivemongo.api.MongoConnection
val driver1 = new reactivemongo.api.MongoDriver // first pool
  val driver2 = new reactivemongo.api.MongoDriver // second pool

  // Pick a connection from the first pool
  def connection1 = driver1.connection(List("addressA", "addressB"))

  // Pick a connection from the second pool
  def connection2 = driver2.connection(List("addressC", "addressD"))

类型3:使用多个连接池

let a = [["a",1],["b",1],["c",1]];

let result = a.reduce((acc, e) => acc[e[0]]=e[1], {});

这三种连接有什么区别?哪种方法在性能方面最好?

1 个答案:

答案 0 :(得分:1)

正如documentation所示,一方面有重量级类型MongoDriverMongoConnection(重要的是它们管理着许多资源,作为网络渠道)。

正如可以在文档中看到的那样,“MongoDriver拥有actor系统”(Akka作为实现细节:“驱动程序创建一个新的actor系统”)而“MongoConnection引用了演员“管理连接池(”创建网络频道“)。

另一方面,如上所述,“DefaultDBCollection只是存储引用的普通对象而不是其他内容。获取此类引用是轻量级的”。

  • 所以案例1 使用单个ActorSystem(作为内存和CPU 成本)和一个连接池。
  • case 2 与第一个不同 定义了2个连接池,只有在使用时才有意义 不同的节点(ReplicaSet),或者具有不同的相同节点 连接选项。
  • 最后案例3 与使用多个驱动程序的第二个驱动程序不同,因此多个ActorSystem,这是没有意义的(除非在非常具体的情况下,例如用于测试)。