2015-01-04 4 views
0

я вижу следующее сообщение об ошибке во время остановки Tomcat:Как исправить org.apache.derby.jdbc.AutoloadedDriver не удалось отменить регистрацию при завершении Tomcat?

Jan 04, 2015 4:14:31 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [] registered the JDBC driver [org.apache.derby.jdbc.AutoloadedDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 

Я понимаю, Tomcat принудительно незарегистрированный драйвер, чтобы предотвратить утечку памяти.

Однако, как исправить и кто несет ответственность за исправление этой проблемы - я, Tomcat DBCP или Derby?

Я использую Tomcat 7.0.47 и Derby 10.11.1.1

context.xml для Tomcat:

<Context> 
    <Resource name="jdbc/db" auth="Container" type="javax.sql.DataSource" 
       driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
       maxActive="100" 
       minIdle="2" 
       maxIdle="30" 
       maxWait="10000" 
       validationQuery="VALUES 1" 
       testOnBorrow="true" 
       removeAbandoned="true" 
       url="jdbc:derby:dev;create=true" 
       username="root" 
       password="root" 
       /> 
</Context> 

Подобные вопросы, которые я нашел на Google ссылается DERBY-4895, но этот вопрос было исправлено некоторое время назад.

+0

где вы развернули банку? – eckes

+0

Я использую плагин Maven Tomcat, чтобы выполнить встроенное развертывание для тестов интеграции. –

+0

Некоторые интересные идеи в этом смежном вопросе: http://stackoverflow.com/questions/3320400/to-prevent-a-memory-leak-the-jdbc-driver-has-been-forcibly-unregistered –

ответ

0

Вы можете просто игнорировать его, или вы можете создать контекста сервлета, который отменяет регистрацию водителей на приложение выключения:

public class MyContextListener implements ServletContextListener{ 

@Override 
public void contextDestroyed(ServletContextEvent arg0) { 
    System.out.println("App shutdown ..."); 

    System.out.println("Deregistering SQL-Drivers ..."); 
    Enumeration<Driver> drivers = DriverManager.getDrivers(); 
    while (drivers.hasMoreElements()) { 
     Driver driver = drivers.nextElement(); 
     try { 
      DriverManager.deregisterDriver(driver); 
      System.out.println(driver.getClass().getName()); 
     } catch (SQLException e) { 
      System.err.println("Error deregistering driver " + driver.getClass().getName()); 
     } 
    } 
} 

@Override 
public void contextInitialized(ServletContextEvent arg0) { 
} 
} 

Конечно, вы должны добавить слушателя в свой web.xml, или аннотировать его с @ Weblistener.

+0

По вашему мнению, кто следует исправить эту проблему. Должен ли я исправить это или дождаться правильного исправления из Derby и/или Tomcat DBCP? –

+0

Эти предупреждения существуют уже много лет, я предлагаю вам исправить это вручную. – Stefan

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