ssm关于jdbc的内存泄漏取消注册警告

ssm框架——警告:为防止内存泄露,已被强制取消注册

搭建了一个ssm框架项目,使用本机tomcat运行,没有问题,非常顺利,但停止运行时,报出了警告:

警告 [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [demo] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
警告 [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [demo] 注册了JDBC驱动程序 [com.microsoft.sqlserver.jdbc.SQLServerDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。

经过上下求索,终于得知:

从版本6.0.24开始,Tomcat附带了内存泄漏检测功能,当webapp的 /WEB-INF/lib
中存在JDBC兼容驱动程序时,它会导致出现此类警告消息,该驱动程序在webapp启动期间使用 ServiceLoader
API自动注册,但是在webapp关闭期间没有自动注销。这条消息纯粹是非正式的,Tomcat已经相应地采取了内存泄漏防护措施。 你能做什么?
忽略这些警告。
Tomcat正在做好自己的工作。实际的错误是在别人的代码(有问题的JDBC驱动程序)中,而不是在你的代码中。很高兴Tomcat正确地完成了它的工作并等到JDBC驱动程序供应商修复它以便你可以升级驱动程序。

我:???不就是让我不管它???不行,我做不到
最终解决办法:

方法一
<dependency>
	  <groupId>com.microsoft.sqlserver</groupId>
	  <artifactId>mssql-jdbc</artifactId>
	  <version>6.4.0.jre8</version>
	  <scope>provided</scope>
</dependency>
<dependency>
	  <groupId>com.alibaba</groupId>
	  <artifactId>druid</artifactId>
	  <version>1.1.8</version>
	  <scope>provided</scope>
</dependency>
  1. 修改pom.xml文件:添加<scope>provided</scope>,这样点击启动后编译出的项目文件的lib中将没有这两个jar包。
  2. 将这两个包放到本机tomcat的lib文件夹下。
  3. 运行项目,不再有警告。
方法二

方法二是通过添加实现ServletContextListener的监听器用于关闭对象和数据库连接池线程,但这个方法我还没试
1.在web.xml中添加listener

<listener>
    <listener-class>com.mysite.MySpecialListener</listener-class>
</listener>

2.监听器

public class MySpecialListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // On Application Startup, please…

        // Usually I'll make a singleton in here, set up my pool, etc.
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        AbandonedConnectionCleanupThread.checkedShutdown();

        ClassLoader cl = Thread.currentThread().getContextClassLoader();

        Enumeration<Driver> drivers = DriverManager.getDrivers();
        while (drivers.hasMoreElements()) {
            Driver driver = drivers.nextElement();

            if (driver.getClass().getClassLoader() == cl) {
                try {
                    System.out.println("Deregistering JDBC driver {}");
                    DriverManager.deregisterDriver(driver);

                } catch (SQLException ex) {
                    System.out.println("Error deregistering JDBC driver {}");
                    ex.printStackTrace();
                }
            } else {
                System.out.println("Not deregistering JDBC driver {} as it does not belong to this webapp's ClassLoader");
            }
        }
    }

}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,我来帮你写。首先,需要定义一个用户模型,用于存储用户的登录信息,包括用户名、密码、邮箱等。其次,需要定义一个注册接口,用户可以通过该接口注册账号,并将用户信息存储到数据库中。最后,需要定义一个登录接口,用户可以通过该接口校验用户名和密码,如果验证通过,则允许用户登录成功。 ### 回答2: 使用SSM框架编写一个登录注册系统,首先需要创建一个数据库表来存储用户信息,包括用户名和密码等字段。 接下来,在MVC架构中,我们需要创建三个模块,即Model、View和Controller。 1. Model模块: 创建一个User类,作为数据模型,包含用户名和密码的字段,并生成对应的setter和getter方法。 2. View模块: 在登录页面中,包含用户名和密码的输入框,以及登录按钮。用户在输入框中输入相应的用户名和密码后,点击登录按钮会触发相应的事件。 在注册页面中,包含用户名和密码的输入框,以及注册按钮。用户在输入框中输入相应的用户名和密码后,点击注册按钮会触发相应的事件。 3. Controller模块: 在Controller类中,处理用户的登录和注册请求。 对于登录功能,首先需要验证用户输入的用户名和密码是否匹配数据库中的用户信息。如果验证通过,则登录成功,可以跳转到用户主页或其他页面。如果验证不通过,则登录失败,可以给出相应的提示信息。 对于注册功能,需要先判断用户输入的用户名是否已经存在于数据库中,如果存在,则注册失败,给出相应的提示信息。如果不存在,则将用户输入的用户名和密码保存到数据库中,并给出注册成功的提示信息。 整个登录注册功能的实现过程中,需要利用SSM框架中的Spring进行依赖注入、作为容器管理Bean;SpringMVC进行请求映射和控制器的处理;MyBatis进行数据库操作,包括增删改查等。 以上就是用SSM框架编写登录注册的简要过程,具体实施时还需考虑安全性、前端页面的美化以及错误处理等方面。 ### 回答3: 使用SSM框架(Spring+Spring MVC+MyBatis)编写一个登录注册功能可以分为以下几个步骤: 1. 设计数据库表结构:创建用户表,包含字段如用户名、密码、邮箱等。 2. 创建实体类:创建用户实体类,按照数据库表结构设计相应的属性和方法。 3. 编写MyBatis映射文件:创建用户映射文件,配置SQL语句以及与实体类的映射关系。 4. 编写数据访问层接口和实现类:创建用户Dao接口和实现类,定义相关的数据库操作方法,如插入用户、查询用户等。 5. 创建Service层接口和实现类:创建用户Service接口和实现类,定义相关的业务逻辑方法,如注册用户、验证登录等。 6. 创建Controller类:创建用户Controller类,处理用户请求和响应,实现用户登录和注册的具体功能。 7. 编写前端页面:创建登录页面和注册页面,设计表单并与后端进行数据交互。 8. 配置Spring MVC:在Spring配置文件中通过注解扫描的方式扫描Controller类,并配置视图解析器等相关配置。 9. 注册用户:在注册页面填写用户信息后,点击注册按钮,前端将表单数据发送给后端Controller类的注册方法,后端调用Service方法进行用户注册,最后返回注册结果给前端页面。 10. 用户登录:在登录页面输入用户名和密码后,点击登录按钮,前端将表单数据发送给后端Controller类的登录方法,后端调用Service方法验证用户信息,最后返回登录结果给前端页面。 总结: 使用SSM框架编写登录注册功能,主要包含数据库设计、实体类创建、MyBatis配置、Dao和Service层的编写、Controller类的创建、前端页面的设计和与后端的数据交互等步骤。通过这些步骤的实现,可以实现一个基本的登录注册功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值