为防止内存泄漏,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
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值