ServletContext属性和静态属性

时间:2013-05-16 16:25:35

标签: java mongodb servlet-listeners

所以,我正在尝试建立一个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如何不为空?为什么偶尔会出现新的联系呢?

1 个答案:

答案 0 :(得分:1)

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

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

当你调用mongoConnection.close()时,连接不会被拆除。它只是返回到连接池以供重用。

默认情况下,池大小为5.这解释了为什么即使关闭它们,最终也会有5个打开的连接(请记住,“关闭”连接将返回到池中)。你可以改变这个尺寸