因此,我试图建立一个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个打开的连接的原因(请记住,“关闭”的连接会返回到池中)。你可以改变这个大小