web注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它

今天在练习javaweb书城项目的时候,操作完数据库后重新部署服务器(redeplory)突然报错
在这里插入图片描述
百度后得出如下原因:
jdbc驱动程序在项目销毁的时候不会自动注销,当项目再次部署的时候就又会有一个驱动。

  • 自6.0.24版以来,Tomcat附带了内存泄漏检测特性,当Webapp的驱动程序中有一个兼容JDBC4.0的驱动程序时,这会导致这种警告消息。/WEB-INF/lib的auto-register时使用ServiceLoaderAPI,但在webapp关机期间这不会自动注销。实际的bug在其他人的代码中(有问题的JDBC驱动程序),而不是在您的代码中。Tomcat在正常工作,并等待JDBC驱动程序供应商解决问题,以便升级驱动程序。另一方面,您不应该在webapp的/ WEB-INF / lib中放置JDBC驱动程序,而只能在服务器的/ lib中放置JDBC驱动程序。 如果你仍然保存在webapp的/ WEB-INF / lib中,那么你应该使用ServletContextListener手动注册和注销它。
  • 降级到Tomcat 6.0.23或更低版本,这样你就不会被那些警告所困扰。但它会悄悄地泄漏内存。这些内存泄漏是Tomcat的OutOfMemoryError问题背后的主要原因之一。
  • 将JDBC驱动程序移动到Tomcat/lib文件夹,并有一个连接池数据源来管理驱动程序。请注意,Tomcat的内置DBCP在关闭时不会正确注销驱动程序。另请参阅作为WONTFIX关闭的bug DBCP-322。您可以将DBCP替换为另一个更好的DBCP连接池。例如HikariCP,BoneCP,或Tomcat JDBC池。

上面就是报错出现的原因,直接无视或者降低tomcat的版本感觉不太行,貌似治标不治本,或者说是掩耳盗铃,将JDBC的驱动程序放到tomcat的/lib,写代码很难受,所以最终我选择给程序添加监听器来手动注销驱动程序。

解决方案:

  1. 创建监听器
public class MyContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("webService start");
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("webService stop");
        try {
            while(DriverManager.getDrivers().hasMoreElements()) {
                DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement());
            }
            System.out.println("jdbc Driver close");
            AbandonedConnectionCleanupThread.checkedShutdown();
            System.out.println("clean thread success");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  1. 在web.xml中声明监听器
    在这里插入图片描述
  2. 成功解决
    在这里插入图片描述
  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
加载Mysql驱动程序出现ClassNotFoundException异常,这通常是由于以下几个原因导致的: 1. 缺少Mysql驱动程序:请确保你的项目中包含了正确的Mysql驱动程序。你可以从Mysql官方网站下载并添加到你的项目中,或者使用构建工具(如Maven或Gradle)来管理依赖。 2. 驱动程序的类名错误:请确保你在代码中使用的驱动程序类名是正确的。根据你提供的异常信息,正确的Mysql驱动程序类名应该是com.mysql.cj.jdbc.Driver。 3. 驱动程序的版本不匹配:请确保你使用的Mysql驱动程序版本与你连接的Mysql数据库版本兼容。不同版本的驱动程序可能具有不同的类名或API,因此需要根据实际情况选择合适的驱动程序版本。 解决这个问题的方法是: 1. 确保你的项目中包含了正确的Mysql驱动程序。可以通过手动添加jar包或使用构建工具来管理依赖。 2. 检查你在代码中使用的驱动程序类名是否正确,应该是com.mysql.cj.jdbc.Driver。 3. 确保你使用的Mysql驱动程序版本与你连接的Mysql数据库版本兼容。 下面是一个简单的示例代码,演示如何加载Mysql驱动程序: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Main { public static void main(String[] args) { try { // 加载Mysql驱动程序 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立数据库连接 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); // 执行数据库操作... // 关闭数据库连接 connection.close(); } catch (ClassNotFoundException e) { System.out.println("找不到Mysql驱动程序"); e.printStackTrace(); } catch (SQLException e) { System.out.println("数据库连接错误"); e.printStackTrace(); } } } ``` 请注意,上述代码中的"jdbc:mysql://localhost:3306/mydatabase"、"username"和"password"需要根据你的实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

star_zhang_jx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值