2012-06-01 54 views
2

我正在寻找一些正确的方式来设置我的web应用程序与Java运行mongoDB的建议。 从mongoDB教程中,我明白我应该只有Mongo类的一个实例。在Java Web应用程序中的MongoDB配置

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

所以我有这个单身提供商(我使用的注射吉斯)

@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的同一个实例。

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

我感到奇怪的是,每次访问我的数据库,我得到的日志这样从蒙戈:

[initandlisten]连接从192.168.1.33:54297#15

接受[initandlisten]连接从192.168.1.33:54299#接受16

到目前为止,我没有任何问题,但我想知道如果这是很好的做法,如果当接受的连接数量过高时,我不会遇到任何问题。

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

谢谢你的建议。

回答

1

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

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

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

+0

好的,谢谢你的回答。 – jonasr

1

成立这样的OM MondoDB网站:

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

而且从MongoSite常见问题,我认为你的问题完全anwsers。

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