关闭MongoDB Java连接

5

我正在尝试设计一个Mongo Db连接类,其中我将MongoClient作为静态对象维护。

private static MongoClient client = null;

public static DB connectToMongo() throws Exception {
    if (null != client) {
        return client.getDB(DBNAME);
    }       
    client = new MongoClient(HOST,PORT);                
    return client.getDB(DBNAME);    
}

我的整个Web应用程序使用以下方法连接到Mongo:

db = MongoDBConnection.connectToMongo();
collection = db.getCollection("collectionName");

在执行数据库操作后,我从未调用过MongoClient的关闭连接方法。连接类总是返回未关闭的MongoClient实例。我唯一关闭的是游标。

  • 每次查询数据库时关闭MongoClient是否必要?我的设计是否合理?
答:虽然每次查询数据库都关闭MongoClient并不是必须的,但最好还是要在使用完之后手动关闭它,以避免出现连接泄露或资源浪费的情况。你当前的设计是有效的,只需要在程序结束时关闭MongoClient即可。
1个回答

17

你一定不应该在每次查询数据库时关闭MongoClient。MongoClient维护一个连接池,建立连接池相对昂贵,因此您需要跨web应用程序的生命周期多次重复使用MongoClient实例。

还有几个要注意的事项:

  • connectToMongo方法存在竞争条件。您需要同步访问该方法,以确保至多创建一个MongoClient实例。
  • 如果您重新部署Web应用程序而没有先重新启动应用程序服务器,则必须确保在关闭Web应用程序时关闭MongoClient。例如,您可以使用ServletContextListener实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接