【发布时间】:2013-05-16 16:25:35
【问题描述】:
所以,我正在尝试建立一个在应用程序的多次使用(页面访问)中保持持久的 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 怎么不为空?为什么偶尔会建立新的联系?
【问题讨论】:
标签: java mongodb servlet-listeners