因此,我试图建立一个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告诉我它不是null。

mongoConnection如何不为null?以及为什么偶尔会建立新的连接?

最佳答案

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

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

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

默认情况下,池大小为5。这说明了即使关闭了连接后,最终还是会有5个打开的连接的原因(请记住,“关闭”的连接会返回到池中)。你可以改变这个大小

09-15 19:00