Закрытие соединений в пуле / кэше (кэш создан с помощью singleton), когда Eclipse перезагружает контекст - PullRequest
2 голосов
/ 27 сентября 2010

Я использую Eclipse для разработки веб-приложения на Java, и мой ИТ-отдел позвонил и сказал, что у меня более 75 открытых оракуловых подключений к Oracle Server для разработки, происходящих с моего ПК.В развернутом приложении уже год используется один и тот же компонент синглтон-соединения, и у меня не было проблем с превышением количества подключений.Он даже подтвердил, что у меня было только 4 открытых соединения на сервере развертывания.Что-то происходит, когда я развиваюсь локально в Eclipse.

Глядя на выходные данные отладки консоли, все выглядит хорошо при первоначальном запуске

Sep 27, 2010 9:39:08 AM org.apache.catalina.startup.Catalina start
== no ConnCache Bean instance found 
== Initializing Connection Cache Data Src
== About to load the properties
== Initializing Datasource for using jdbc:oracle:thin:@hostname:port:oracle-sid
== Reading property file 
== Setting InitialLimit to 3
== Properties {TimeToLiveTimeout=4, MinLimit=4, ConnectionWaitTimeout=44, MaxLimit=5, InitialLimit=3, AbandonedConnectionTimeout=281, InactivityTimeout=269}

Но затем я заметил следующее сообщение SEVERE в консоли, когда Eclipse перезагружает контекст

Sep 27, 2010 9:40:38 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading this Context has started
Sep 27, 2010 9:40:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [] registered the JBDC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister 
it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Sep 27, 2010 9:40:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [] appears to have started a thread named [Thread-9] but has failed to stop it. 
This is very likely to create a memory leak.

Я предполагаю, что Eclipse воссоздает кэш соединений каждый раз, когда он перезагружает контекст, а старые соединения и кеш не разрушаются.Как я могу заставить Eclipse завершить кеш или закрыть все предыдущие соединения, когда контекст перезагружается.При необходимости я могу опубликовать свой класс connectionBean.

1 Ответ

2 голосов
/ 27 сентября 2010

Похоже, что вы теряете память через незакрытые соединения предыдущей версии приложения.Это вполне возможно, если вы выбрали автоматическую публикацию вашего веб-приложения из Eclipse в Tomcat.

Tomcat отбрасывает текущий загрузчик классов веб-приложения, когда он пытается выполнить перезагрузку.Все объекты из этого корня GC (загрузчик классов), которые все еще будут храниться, не будут собираться мусором.Из-за наличия синглтона (я предполагаю, что синглтон хранит объект DataSource или поддерживает пул Connection объектов), эти Connection объекты никогда не будут рассматриваться как недоступные объекты, и, следовательно, будутне иметь права на GC.

В краткосрочной перспективе вы можете сделать следующее:

  • Если вы можете помочь, перезапустите Tomcat всякий раз, когда вам нужно опубликовать новую версиюapplication.
  • Реализация ServletContextListener и попытка отбросить одноэлементную ссылку, когда контекст сервлета (приложения) разрушен.Это делает одноэлементный объект недоступным и, следовательно, пригодным для GC.Это рекомендуется, поскольку то же самое обязательно произойдет в рабочей среде, если только Tomcat не будет перезапущен.

Кстати, это поведение, при котором в синглетах возникает память и, следовательно, происходит утечка соединения на любом сервере приложений.До тех пор, пока приложение повторно развертывается без перезапуска сервера.Единственный способ предотвратить это - обеспечить уничтожение синглтона при уничтожении контекста приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...