Java Database Connectivity(JDBC)をDriverManagerに登録している状態で、ServletコンテナのTomcatを終了する時に以下のようなログが出力されることがあります。
警告: The web application [コンテキスト名] registered the JDBC driver [JDBC] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
これは、DriverManagerに登録済みJDBCの登録を解除していない状態で、Tomcatのシャットダウン時に、Tomcat 6.0.24以降に実装されているメモリリーク検出機能が動作することによりログが出力されます。
ログの出力レベルが警告レベルのため無視しても問題はありません。また、登録済みJDBCの解除処理は、Tomcat側で自動的に実施しています。詳細は、こちらを確認してください。
ただし、明示的にJDBCをDriverManagerから解除することも可能です。今回は、登録したJDBCをDriverManagerから解除する方法を紹介します。
環境
検証に使用した環境/ライブラリを以下に記載します。
- Java:11
- Tomcat:8.5.49
JDBCの登録方法
JDBCをDriverManagerに登録する方法を紹介します。登録済みの場合は、次の解除方法まで読み飛ばして問題ありません。
使用するJDKのバージョンにより登録方法が異なるため注意してください。詳しい違いについては、こちらが参考になります。
JDBC3.0(JDK1.4以降)
Class.forName("使用するドライバーのクラス名");
// H2 Databaseを使用する場合は「org.h2.Driver」を指定します。
JDBC4.0(JDK1.6以降)
「Class.forName」を実行する必要はありません。また、実行しても問題はありません。
JDBCの解除方法
Servletコンテナを使用している場合は、javax.servlet.ServletContextListenerのcontextDestroyedを実行するタイミングで解除処理を実施します。次の方法で解除することが可能になります。
@Override
public void contextDestroyed(ServletContextEvent sce) {
Collections.list(DriverManager.getDrivers()).forEach(driver -> {
try {
DriverManager.deregisterDriver(driver);
} catch (final Exception e) {
}
});
}
「DriverManager.getDrivers」を使用して、登録済みのJDBCを取得することができます。
「DriverManager.deregisterDriver」を使用して、登録済みのJDBCを削除することができます。
まとめ
JDBCをDriverManagerへの登録/解除する方法を紹介しました。
参考
Class Reference:DriverManager