因此,我正在尝试建立一个在应用程序的多次使用(页面访问)中保持持久的 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
不为空?为什么偶尔会建立新的联系?