2015-01-04 60 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或德比?

我使用Tomcat的7.0.47德比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> 

我在谷歌發現了類似的問題,引用DERBY-4895,但這個問題已經被修復了一陣子。

+0

你在哪裏部署了jar? – eckes

+0

我正在使用Maven Tomcat插件來進行集成測試的嵌入式部署。 –

+0

在這個相關的問題一些有趣的想法:http://stackoverflow.com/questions/3320400/to-prevent-a-memory-leak-the-jdbc-driver-has-been-forcibly-unregistered –

回答

0

你可以簡單地忽略它,或者你可以創建註銷在應用程序關閉驅動程序的ServletContextListener:

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