【问题标题】:MongoDB configuration in a java web appJava Web 应用程序中的 MongoDB 配置
【发布时间】:2012-06-01 14:42:12
【问题描述】:

我正在寻找一些关于为我的使用 java 运行的 Web 应用程序设置 mongoDB 的正确方法的建议。 从 mongoDB 教程中,我了解到我应该只有一个 Mongo 类的实例。

Mongo 类被设计成线程安全的并且在线程之间共享。通常,您只为给定的数据库集群创建 1 个实例并在您的应用中使用它。

所以我为此有一个单例提供程序(我正在使用 guice 进行注入)

@Singleton
public class MongoProvider implements Provider<Mongo> {
    private Mongo mongo;

    public Mongo get() {
        if (mongo == null)
            mongo = new Mongo("localhost", 27017);
        return mongo;
    }
}

每当我必须在我的 web 应用程序中使用 mongo 时,我都会注入提供程序并获得相同的 mongo 实例。

public class MyService {
    private Provider<Mongo> mongoProvider;

    @Inject
    private MyService(Provider<Mongo> mongoProvider) {
        this.mongoProvider = mongoProvider;
    }

    public void execute() {
        DB db = mongoProvider.get().getDB("mydatabase");
        DBCollection coll = db.getCollection("mycollection");

        // Do stuff in collection
        ...
    }
}

我觉得奇怪的是,每次我访问我的数据库时,我都会从 mongo 获得这样的日志:

[initandlisten] 接受来自 192.168.1.33:54297 #15 的连接

[initandlisten] 接受来自 192.168.1.33:54299 #16 的连接

到目前为止,我还没有遇到任何问题,但我想知道这是否是一种好的做法,以及当接受的连接数太高时我是否不会遇到任何问题。

  • 我的整个应用程序是否也应该只有一个 DB 对象实例?
  • 我是否必须对 MongoDB 进行不同的配置才能在一段时间后自动关闭连接?还是我必须手动关闭连接?我已经阅读了有关在 Mongo 上使用 close() 方法的内容,但我不确定何时或是否调用它。

感谢您的建议。

【问题讨论】:

    标签: java mongodb mongo-java


    【解决方案1】:

    这是一个很好的做法。每个 Mongo 实例都管理一个连接池,因此您将在 mongod 日志中看到多个连接,池中的每个连接对应一个连接。默认池大小为 10,但可以使用 MongoOptions 中的 connectionsPerHost 字段进行配置。

    Mongo 实例还维护数据库实例的缓存,因此您不必担心自己将这些实例维护为单例。

    您不必将 Mongo 配置为自动关闭连接。您可以在适当的时候调用 Mongo#close 来关闭连接池中的所有套接字。

    【讨论】:

      【解决方案2】:

      创建了类似这样的 om MondoDB 网站:

      “Java MongoDB 驱动程序是线程安全的。例如,如果您在 Web 服务环境中使用,您应该创建一个 MongoClient 实例,并且可以在每个请求中使用它。MongoClient 对象维护一个内部池与数据库的连接(默认池大小为 10)。对于对 DB 的每个请求(查找、插入等),Java 线程将从池中获取连接,执行操作,然后释放连接。 这意味着每次使用的连接(socket)可能不同。”

      来自 MongoSite 的常见问题解答,我认为它完全可以回答您的问题。

      http://docs.mongodb.org/manual/faq/developers/#why-does-mongodb-log-so-many-connection-accepted-events

      【讨论】:

        猜你喜欢
        • 2010-12-06
        • 2013-06-09
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多