gpt4 book ai didi

java - ServletContext 属性和静态属性

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:37 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

关于java - ServletContext 属性和静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16592741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com