为防止内存泄漏,JDBC驱动程序已被强制取消注册问题 解决办法。

1、原因

驱动程序不会被取消注册,这反过来会阻止您的Web应用程序类.这有效地造成了内存泄漏.

为防止此特定内存泄漏,您应编辑tomcat/conf/server.xml并更改

1、原因

它是JDBC的设计。第一次创建数据库连接时,webapp会加载并注册JDBC驱动程序,这意味着驱动程序加载了Web应用程序类加载器。
在取消部署时,驱动程序不会被取消注册,驱动程序不会被取消注册,这反过来会阻止Web应用程序类,这一点造成了内存泄漏。
所以,为防止此特定内存泄漏,我们应编辑tomcat/conf/server.xml并更改(在Tomcat的根目录中更改即可)

2、解决办法

将原来的代码:

<listener classname="org.apache.catalina.core.JreMemoryLeakPreventionListener">
</listener>

更改为:

<listener classname="org.apache.catalina.core.JreMemoryLeakPreventionListener" classestoinitialize="com.mysql.jdbc.NonRegisteringDriver">
</listener>

即可。

3、为什么要修改server.xml?

由于MySQL的“被遗弃的连接清理线程”,另一个内存泄漏显现,该线程从第一个请求开始,并保存对webapp的类加载器的引用,随着classesToInitialize就可以防止这种内存泄漏了。

4、另一种原因就是如果你使用的是Mybatis的话,在访问数据库的方法中,打开了SqlSession会话而没有及时用sqlSession.close();关闭

public Goods load(String bid) {
        SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSession();
        // 通过反射获取接口GoodsMapper的Class对象
        // 赋给实现了该接口的类(GoodsMapper)的对象(goodsMapper),以此来调用已经被实现的sql方法。
        GoodsMapper goodsMapper = sqlSession.getMapper(GoodsMapper.class);
        /*
         * 通过数据库查找到bid所属商品的详细信息,以一个map作为结果返回
         * 再封装到goods对象中
         */
        Map<String, Object> map = goodsMapper.findByBid(bid);
        Goods goods = CommonUtils.toBean(map, Goods.class);
        /*
         * 因为默认goods的pojo类中没写cid,只写了一个Category对象
         * 所以再封装成Category对象,只是要其中的cid而已
         */
        Category category = CommonUtils.toBean(map, Category.class);
        // 将二者建立联系
        goods.setCategory(category);
        // 把pid获取出来,创建一个Category parent,把pid赋给他,再把parent赋给category
        if (map.get("pid") != null) {
            Category parent = new Category();
            parent.setCid((String) map.get("pid"));
            category.setParent(parent);
        }
        sqlSession.close(); // 注意要在方法最后这里关闭sqlSession,不然会有很多问题
        // 返回查到的单个商品对象
        return goods;
    }

希望能帮助你解决类似问题~

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 这段文字是报错信息,大意为已经注册jdbc驱动程序(com.alibaba.druid.proxy.druiddriver),但在web应用程序停止时无法注销它。为了防止内存泄漏jdbc驱动程序已被强制取消注册。 ### 回答2: JDBCJava Database Connectivity的缩写,它是Java编程语言中用于与关系型数据库建立连接的一套API。使用JDBC需要通过注册驱动程序来实现数据库的连接,例如com.mysql.jdbc.Driver。 在Web应用程序中,我们通常需要使用数据库来存储数据,因此需要注册JDBC驱动程序。当Web应用程序停止运行时,需要注销已注册JDBC驱动程序,以防止内存泄漏,这是非常重要的一步。 然而,在某些情况下,注销已注册JDBC驱动程序可能会遇到问题。如果我们使用的是com.alibaba.druid.proxy.DruidDriver,当Web应用程序停止时,无法注销该驱动程序。 为了避免内存泄漏JDBC驱动程序强制取消注册。这意味着在下一次需要使用该驱动程序时,需要重新注册它。因此,在使用JDBC驱动程序时,我们需要特别注意其注册和注销的方法,以避免潜在的内存泄漏问题。 总之,在Web应用程序中使用JDBC驱动程序是一个非常重要的过程。我们需要正确地注册和注销驱动程序,以确保应用程序的稳定性和安全性。否则,不仅会导致内存泄漏问题,还可能会在应用程序运行过程中发生不可预测的错误。 ### 回答3: JDBC驱动程序注册和注销是非常重要的操作。注册驱动程序时,需要提供正确的驱动程序类名,否则将无法正确加载驱动程序,从而无法正常使用数据库连接。在Web应用程序启动时,通常会注册所有需要使用的数据库驱动程序,这样在应用程序运行过程中就可以随时获取数据库连接,以执行相关的操作。 然而,当Web应用程序停止时,需要对已注册JDBC驱动程序进行注销操作。否则,这些驱动程序可能会在内存中持续存在,导致内存泄漏,影响应用程序的性能和稳定性。为避免这种情况的发生,JDBC驱动程序应该在应用程序停止时被正确注销。 如果在Web应用程序停止时,无法正确注销JDBC驱动程序,那么可能会出现内存泄漏的情况。这时,需要强制取消注册JDBC驱动程序,以释放内存资源。强制取消注册驱动程序的方法是,调用DriverManager.deregisterDriver()函数,将注册驱动程序驱动程序管理器中删除。 总之,为了避免内存泄漏和提高应用程序的性能,必须正确注册和注销JDBC驱动程序。如果出现无法注销的情况,可以通过强制取消注册的方式,释放内存资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值