问题解决:严重: Web应用程序注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它
在我练习ssm框架时,我的tomcat关闭时每次都弹出一个严重: Web应用程序注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它
,随后我在网上搜了半天的解决方案,在这记录备忘
解决方案一(网上大部分的解决方案):
配置一个ServletContextListener,在servletContext关闭时对驱动程序进行清理。
@Slf4j
@WebListener("关闭servletContext时注销jdbc驱动")
public class DriverMangerListener implements ServletContextListener {
@Override
public void contextInitialized (ServletContextEvent sce ){
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("[DriverMangerListener]:-------DriverManager deregisterDriver start...");
//获取当前以及注册jdbc驱动的枚举(多数据源下依旧可用)
Enumeration<Driver> enumeration = DriverManager.getDrivers();
while (enumeration.hasMoreElements()) {
try {
//从注册列表移除jdbc驱动
DriverManager.deregisterDriver(enumeration.nextElement());
} catch (SQLException e) {
log.warn("[DriverMangerListener]:-------deregisterDriver error");
}
}
log.info("[DriverMangerListener]:-------DriverManager deregisterDriver end...");
}
}
但是这个大多数情况下都靠谱的解决方案在我的项目中依然不是那么靠谱。在我向项目中添加了这个监听器后依然抛出严重: Web应用程序注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它
,这让我感到非常疑惑。于是我打印了获得的jdbc驱动的枚举,结果出人意料:里面是空的。
解决方案二:删掉pom.xml中的jdbc依赖
既然是jdbc报的错,那么就干掉他(误),但由于运行项目时,jdbc是由tomcat的lib提供的,所以删掉jdbc依赖也没问题,在关闭tomcat时确确实实没有再报这个错误。
解决方案三:进阶版方案二
服务器是不报错了,但是代码由于项目没有了jdbc的依赖,我的idea变得万紫千红,用到jdbc接口的地方全都报了错,那咋办呢,该加的依赖还得加上。但是可以让他再运行时不再与tomcat的lib冲突,在依赖项的范围我限制为provided(已提供的)。tomcat完美关闭,我的类也没有再报错。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
<scope>provided</scope>
</dependency>