6

我正在为 MongoDB 使用最新的 Java 驱动程序 (2.11.1)。MongoDB Java API 本质上是

  • MongoClient 类的一个实例(带有内部连接池)
  • getDB() 用于获取 DB 对象
  • getCollection() 用于获取 DBCollection 对象

1) 何时建立与 db 的连接?是在调用 getDB() 还是调用 getCollection() 时?

2) 调用 getDB() 一次还是每次需要时更好?(这有关系吗?- MongoClient 保持数据库对象缓存?)

3) 多线程重用单个 DBCollection 对象还是从多线程调用 getCollection() 更好?(DBCollection 是否已缓存?)

4

2 回答 2

7

MongoClient 类管理从客户端应用程序到 MongoDB 集群的延迟加载连接池。您可以使用每个主机的特定连接数以及等待连接的线程数来初始化 MongoClient。由于 MongoClient 管理连接数和线程并发性,因此您需要为每个虚拟机使用该类的一个实例。DB 和 DBCollection 都通过 MongoClient 的连接池执行它们的操作,因此不需要缓存它们。您实例化的 DB 或 DBCollection 对象的数量没有限制。但是,由于这些类是线程安全的,并且可以使用特定的读取偏好和写入关注点进行设置,因此您可以使用 DB 或 DBCollection 类的单个实例来执行多个操作。

于 2013-06-11T15:18:47.213 回答
0

1)当我们做一些操作(查找、更新、删除等)时建立连接

2) Doc 说:“通常你只为给定的数据库集群创建 1 个实例并在你的应用程序中使用它”。因此,没有缓存 DB 对象的意义,它也没有缓存在驱动程序代码中

3) DBCollection 和 DB 是线程安全的。DBCollection 缓存在驱动程序的 DBApiLayer 类中。

于 2013-06-06T08:35:15.070 回答