2013-05-16 3 views
1

Итак, я пытаюсь сделать соединение 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 не имеет значения? И почему возникают спорадически новые связи?

ответ

1

MongoClient - это пул соединений; он поддерживает несколько открытых подключений к базе данных для производительности (создание нового соединения является дорогостоящим).

Когда вы вызываете mongoConnection.getDB («DB»), MongoClient будет извлекать соединение с базой данных из пула соединений. если в пуле соединений нет доступных подключений, он создаст новое соединение и добавит его в пул.

, когда вы вызываете mongoConnection.close(), соединение не срывается. он просто возвращается в пул соединений для повторного использования.

по умолчанию размер пула - 5. Это объясняет, почему у вас в конечном итоге будет 5 открытых соединений, даже если вы их закрыли (помните, что «закрытые» соединения возвращаются в пул). вы можете изменить этот размер

+0

Hrm. (возвращается и просматривает историю). Я открыл до 11 подключений одновременно ... где я могу найти, для чего установлен размер пула? Они не все появляются в то же время, у них есть такая спорадическая картина. 'mongoConnection.close()' вызывается только один раз - когда apache отключается. Затем все эти дополнительные соединения уходят. Должен ли я чаще закрываться? –

+0

Также - любая идея по другому вопросу? Почему 'mongoConnection' не null? Я рад, что это работает ... но я просто запускал тест, который еще не должен был работать.И был удивлен, когда это произошло. Хотелось бы узнать, почему. –

+0

есть конструктор MongoClient, который имеет MongoClientOptions в качестве второго параметра. вы можете установить connectionPerHost в параметрах. вы должны закрыть соединения сразу после использования, а не только во время выключения. Я не уверен, как вы добираетесь до 11 одновременных соединений. – happymeal

Смежные вопросы