问题解决:严重: Web应用程序注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它

问题解决:严重: 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>

### 解决虚拟机中无法加载 MySQL 驱动程序 `com.mysql.cj.jdbc.Driver` 的方案 当遇到虚拟机中无法加载 MySQL JDBC 驱动程序问题,通常是因为缺少必要的依赖项或配置不正确。以下是详细的解决方案: #### 1. 检查驱动文件是否存在并已添加至项目 确保下载了最新版本的 MySQL Connector/J 并将其放置于项目的类路径下。如果使用的是 Maven 或 Gradle 构建工具,则需确认 pom.xml 文件或 build.gradle 中包含了正确的依赖声明。 对于 Maven 用户,在 pom.xml 添加如下依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version><!-- 版本号应根据实际情况调整 --> </dependency> ``` 对于 Gradle 用户,在 build.gradle 添加如下依赖: ```groovy implementation 'mysql:mysql-connector-java:8.0.32'// 版本号应根据实际情况调整 ``` #### 2. 修改数据库连接 URL 和属性设置 更新应用程序中的数据源配置部分,指定完整的 JDBC 连接字符串以及所需的参数。例如: ```java String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; Properties props = new Properties(); props.setProperty("user", "root"); props.setProperty("password", ""); Connection conn = DriverManager.getConnection(url, props); ``` 注意这里设置了 `useSSL=false` 来禁用 SSL 加密通信,并指定了默认区为 UTC;同假设 root 用户无密码访问本地主机上的 testdb 数据库[^1]。 #### 3. 确认 JVM 参数支持 TLS 协议 某些旧版 JDK 可能会因为安全策略而阻止与较新的 MySQL Server 建立连接。此可以尝试通过启动命令行选项来放宽限制: ```bash -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 ``` #### 4. 排除其他潜在因素影响 排除防火墙规则、网络连通性和权限控制等方面可能存在的干扰因素。另外还需验证 MySQL 服务端口是否开放且监听状态正常。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值