在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了.