【问题标题】:When does MongoDB Java Driver makes connection?MongoDB Java Driver 何时建立连接?
【发布时间】:2013-06-06 04:50:44
【问题描述】:

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

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

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

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

3) 是多线程复用单个 DBCollection 对象还是多线程调用 getCollection() 更好? (DBCollection 缓存了吗?)

【问题讨论】:

  • 有一个简单的测试可以知道:创建一个main(),它会做一个简单的查询,关闭你的MongoDB,看看它在哪里出错:p

标签: java mongodb mongodb-java


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • Doc 说每个 JVM 应该有一个 MongoClient 实例。这与缓存 DB 或 DBCollection 对象有何关系。
    • DB 对象是实际数据库的逻辑表示。可能是我使用的语言错误,是的,必须缓存 DB 的详细信息,但每个 MongoClient 只是 1 个 DB 对象,但每个 DB 有很多 DBCollection。
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多