Итак, я пытаюсь сделать соединение Mongo, которое остается постоянным при нескольких применениях приложения (обращения к страницам). Я устал от всех этих соединений, созданных во время моего тестирования, и я хочу использовать надлежащую процедуру, имея это одно постоянное соединение. Лучшие практики и все такое.Атрибуты и статические свойства ServletContext
Вот что у меня есть:
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 соединений.
Confusing: Я даже не знаю, как это удается сделать эти соединения. Отслеживание вызовов метода - setupMongoClient
называется только - при запуске сервера apache. Это единственное место во всей системе, которое устанавливает mongoConnection
.
Когда я нажимаю кнопку, mongoConnection
не установлен. И все же данные извлекаются из базы данных монго, а тестирование mongoConnection
показывает, что оно не равно нулю.
Как есть mongoConnection
не имеет значения? И почему возникают спорадически новые связи?
Hrm. (возвращается и просматривает историю). Я открыл до 11 подключений одновременно ... где я могу найти, для чего установлен размер пула? Они не все появляются в то же время, у них есть такая спорадическая картина. 'mongoConnection.close()' вызывается только один раз - когда apache отключается. Затем все эти дополнительные соединения уходят. Должен ли я чаще закрываться? –
Также - любая идея по другому вопросу? Почему 'mongoConnection' не null? Я рад, что это работает ... но я просто запускал тест, который еще не должен был работать.И был удивлен, когда это произошло. Хотелось бы узнать, почему. –
есть конструктор MongoClient, который имеет MongoClientOptions в качестве второго параметра. вы можете установить connectionPerHost в параметрах. вы должны закрыть соединения сразу после использования, а не только во время выключения. Я не уверен, как вы добираетесь до 11 одновременных соединений. – happymeal