java - Java Web 应用程序中的 MongoDB 配置

标签 java mongodb mongo-java

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

The Mongo class is designed to be thread safe and shared among threads. Typically you create only 1 instance for a given DB cluster and use it across your app.

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

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

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

每当我必须在我的网络应用程序中使用 mongo 时,我都会注入(inject)提供程序并获得相同的 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] connection accepted from 192.168.1.33:54297 #15

[initandlisten] connection accepted from 192.168.1.33:54299 #16

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

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

谢谢你的建议。

最佳答案

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

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

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

关于java - Java Web 应用程序中的 MongoDB 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852373/

相关文章:

java - 如何从java中的系统字体获取ttf字体数据

mongodb加入 meteor

node.js - 如何通过nodejs启动BAT文件?

mongodb - 对子数组文档执行 $sort

java - 使用 Java 形成 MongoDB 复杂查询

java - 在 Android Q 中从外部存储访问照片

java - 在 Netbeans 中将 JDialog 转换为 JPanel

java - ActiveMQ查询: How to start

MongoDB 编写正确的查询

java - 无法将 BasicDBObject 转换为 [B