C3P0连接池在Tomcat服务关闭时报多个线程无法停止的问题

在TomCat服务器关闭时,使用c3p0或者别的连接池会报出连接池关闭失败,可能会导致内存泄漏的问题,解决如下:

    首先是连接池的配置 注意:destroy-method="close"  
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
       <property name="driverClass" value="${jdbc.driver}"/>
       <property name="jdbcUrl" value="${jdbc.url}"/>
       <property name="user" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>

       <!-- c3p0连接池的私有属性 -->
       <property name="maxPoolSize" value="30"/>
       <property name="minPoolSize" value="10"/>
       <!-- 关闭连接后不自动commit -->
       <property name="autoCommitOnClose" value="false"/>
       <!-- 获取连接超时时间 -->
       <property name="checkoutTimeout" value="10000"/>
       <!-- 当获取连接失败重试次数 -->
       <property name="acquireRetryAttempts" value="2"/>
    </bean>

然后配置监听器

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("Web start");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("Web 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 throwables) {
                throwables.printStackTrace();
            }

    }
}

在web.xml中注册监听器

    <listener>
        <listener-class>com.bjpowernode.listener.MyListener</listener-class>
    </listener>

如果之后启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

找出占用1099端口的进程,进入windows命令,查看什么进程占用了1099端口

  使用命令:netstat -aon|findstr 1099 找出占用1099端口的进程

        然后关闭占用该端口的进程:taskkill -f -pid 3756

  这样就可以正常启动Tomcat了.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值