所以,我正在尝试建立一个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);
}
}
的EntityManager
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
如何不为空?为什么偶尔会出现新的联系呢?
答案 0 :(得分:1)
MongoClient是一个连接池;它维护了许多与数据库的开放连接以提高性能(创建新连接的成本很高)。
当您调用mongoConnection.getDB(“DB”)时,MongoClient将从连接池中检索数据库连接。如果连接池中没有可用的连接,它将创建一个新连接并将其添加到池中。
当你调用mongoConnection.close()时,连接不会被拆除。它只是返回到连接池以供重用。
默认情况下,池大小为5.这解释了为什么即使关闭它们,最终也会有5个打开的连接(请记住,“关闭”连接将返回到池中)。你可以改变这个尺寸