Почему соединения сохраняются, когда я удаляю веб-приложение, используя пул соединений Tomcat 7 JDBC? - PullRequest
6 голосов
/ 08 декабря 2011

У меня есть минимальное веб-приложение Spring, развернутое на Tomcat 7.0.22 - оно состоит из пары страниц, контроллера, службы и DAO, у которого есть один метод, выполняющий запрос SELECT.

Веб-приложение настроено на использование нового пула соединений Tomcat JDBC - здесь приведена конфигурация ресурса в context.xml веб-приложения:

<Resource name="jdbc/myDB"
          auth="Container"
          type="javax.sql.DataSource"
          driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@blah blah"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          maxActive="15"
          initialSize="5"
          maxWait="40000"
          validationQuery="select 1 from dual"
          removeAbandoned="true"
          removeAbandonedTimeout="300"
          logAbandoned="false"
          username="user"
          password="pass"
          testOnBorrow="true"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="60000"
          minEvictableIdleTimeMillis="60000" />

При развертывании веб-приложения появляется 5 подключений (запрос v $ session из SQL Developer). Когда я удаляю веб-приложение, соединения сохраняются (в состоянии WAITING). Каждый раз, когда я повторно внедряю свое веб-приложение, появляются 5 новых подключений.

Похоже, что пул все еще находится вокруг, а кнопка "Найти утечки" в приложении-диспетчере Tomcat сообщает мне, что в приложении происходит утечка памяти.

Как избавиться от пула, когда веб-приложение не развернуто?

Ответы [ 3 ]

4 голосов
/ 23 декабря 2011

Проблема была нанесена самому себе (как и большинство). Мой источник данных был настроен в web.xml моего веб-приложения, и я ссылался на него через JNDI. Теперь я создаю свой источник данных, как показано в справочном документе Spring ( раздел 13.3.1 ), а метод destroy заботится о закрытии источника данных и пула.

Если бы мне потребовалось придерживаться источника данных JNDI, мне пришлось бы закрыть источник данных в классе, который реализует ServletContextListener, в методе contextDestroyed.

2 голосов
/ 04 сентября 2012

Такое поведение сообщается в Apache Tomcat bugzilla, ссылка:

https://issues.apache.org/bugzilla/show_bug.cgi?id=25060

Исправлено в Tomcat 7.0.11. Какую версию Tomcat вы используете?

Если вы используете создание источника данных, как описано в справочнике Spring на «уровне приложения», у вас возникнут небольшие издержки, когда речь идет о задачах администрирования, если у вас много приложений и много серверов.

1 голос
/ 21 августа 2014

У меня была та же проблема, и я не мог использовать spring, поэтому я использовал org.apache.tomcat.jdbc.pool.DataSourceProxy , чтобы закрыть источник данных Tomcat.Этот API предоставляет вам функциональность, которая еще не реализована в интерфейсе JDK DataSource.

DataSourceProxy myDataSource = (DataSourceProxy) myDataSource;
myDataSource.close();   
  • Также используется factory = "org.apache.tomcat.jdbc.pool.DataSourceFactory" и метод contextDestroyed ServletListener.
...