1

因此,我正在尝试建立一个在应用程序的多次使用(页面访问)中保持持久的 Mongo 连接。我厌倦了在测试期间建立的所有这些连接,我想通过拥有那个单一的持久连接来使用正确的程序。最佳实践等等。

这是我所拥有的:

web.xml

<listener>
    <listener-class>com.core.tools.MyServletContextListener</listener-class>
</listener>

com.core.tools.MyServletContextListener

public class MyServletContextListener implements ServletContextListener {
    private static Logger log = org.apache.log4j.Logger.getLogger(MyServletContextListener.class);
    public void contextInitialized( ServletContextEvent sce ){
        try {
            EntityManager.setupMongoClient(sce);
        } catch (UnknownHostException e) {
            log.error("Error setting up Servlet Context");
        }
    }

    public void contextDestroyed( ServletContextEvent sce ){
        EntityManager.closeMongoClient(sce);
    }
}

实体管理器

public class EntityManager {
    private static MongoClient      mongoConnection = null;
    private static Jongo            jongoDatasource = null;

    public static void setupMongoClient( ServletContextEvent sce ) throws UnknownHostException{
        if( sce.getServletContext().getAttribute("mongo") == null ){
            mongoConnection = new MongoClient("localhost");
            sce.getServletContext().setAttribute("mongo", mongoConnection );
        }else if (mongoConnection == null) {
            mongoConnection = (MongoClient) sce.getServletContext().getAttribute("mongo");
        }
    }

    public static Jongo getJongoDatasource(){
        if( jongoDatasource == null ){
            jongoDatasource = new Jongo(mongoConnection.getDB("coreTest"));
        }
        return jongoDatasource;
    }

    public static void closeMongoClient( ServletContextEvent sce ){
        if( sce.getServletContext().getAttribute("mongo") != null ){
            mongoConnection = (MongoClient) sce.getServletContext().getAttribute("mongo");
            mongoConnection.close();
        }
    }
}

发生什么了:

好消息 - 现在我的连接在服务器关闭时得到清理。

坏消息 - 我仍然不断获得大量的连接被创建。每次我按下按钮时,它都会建立一个新的连接……但只有大约 4 或 5 个连接。然后它突然停止添加新连接一段时间。然后它会再增加3个。然后等待。然后另一个2。然后什么都没有。然后几分钟后,它突然又增加了 5 个连接。

困惑:我什至不知道它是如何建立这些联系的。跟踪方法调用 -setupMongoClient只调用一次- 当 apache 服务器启动时。它是整个系统中唯一设置mongoConnection.

每当我按下按钮时,mongoConnection都没有设置。然而,数据是从 mongo 数据库中提取的,测试mongoConnection表明它不为空。

怎么mongoConnection不为空?为什么偶尔会建立新的联系?

4

1 回答 1

1

MongoClient 是一个连接池;它维护许多与数据库的开放连接以提高性能(创建新连接的成本很高)。

当您调用 mongoConnection.getDB("DB") 时,MongoClient 将从连接池中检索数据库连接。如果连接池中没有可用的连接,它将创建一个新连接并将其添加到池中。

当您调用 mongoConnection.close() 时,连接不会断开。它只是简单地返回到连接池以供重用。

默认情况下,池大小为 5。这解释了为什么即使您关闭了它们,您最终也会有 5 个打开的连接(请记住,“关闭”的连接会返回到池中)。你可以改变这个尺寸

于 2013-05-16T16:43:35.127 回答