java web应用程序中的MongoDB配置

java web应用程序中的MongoDB配置,java,mongodb,mongo-java,Java,Mongodb,Mongo Java,我正在寻找一些关于为运行java的web应用程序设置mongoDB的正确方法的建议。 从mongoDB教程中,我了解到我应该只有一个Mongo类的实例 Mongo类被设计成线程安全的,并在线程之间共享。通常,您只为给定的DB集群创建一个实例,并在应用程序中使用它 因此,我为此提供了一个单例提供程序(我使用guice进行注入) @Singleton 公共类MongoProvider实现提供程序{ 私人Mongo Mongo; 公共MongoGet(){ if(mongo==null) mongo=

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

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

因此,我为此提供了一个单例提供程序(我使用guice进行注入)

@Singleton
公共类MongoProvider实现提供程序{
私人Mongo Mongo;
公共MongoGet(){
if(mongo==null)
mongo=新的mongo(“本地主机”,27017);
返回mongo;
}
}
无论何时我必须在我的webapp中使用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
        ...
    }
}
公共类MyService{
私人供应商mongoProvider;
@注入
私有MyService(提供商mongoProvider){
this.mongoProvider=mongoProvider;
}
public void execute(){
DB=mongoProvider.get().getDB(“mydatabase”);
DBCollection coll=db.getCollection(“mycollection”);
//收藏
...
}
}
我觉得奇怪的是,每次我访问数据库时,我都会从mongo得到这样的日志:

[initandlisten]从192.168.1.33:54297#15接受连接

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

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

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

谢谢你的建议。

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

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


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

创建了类似om MondoDB的网站:

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

来自MongoSite的常见问题解答,我认为这完全回答了您的问题

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
        ...
    }
}