在tomcat热部署中,解决jdbc无法释放,war包无法彻底删除的问题

本文详细介绍了如何在web.xml中添加listener进行资源清理,并通过替换dbcp连接池为c3p0来解决bug,同时优化了applicationContext.xml配置和tomcat配置,最终达到提高应用性能的目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在web.xml中添加一个listener

ServletContextLTest.java

package com.southgis.grid.csgl.cas;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Set;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import net.sf.ehcache.CacheManager;
public class ServletContextLTest implements ServletContextListener {
 @SuppressWarnings("deprecation")
 public void contextDestroyed(ServletContextEvent arg0) {
  System.out.println("public void contextDestroyed(ServletContextEvent arg0) {");
  CacheManager.getInstance().shutdown();
  Enumeration<Driver> drivers = DriverManager.getDrivers();
     while (drivers.hasMoreElements()) {
         Driver driver = drivers.nextElement();
         try {
             DriverManager.deregisterDriver(driver);
             System.out.println(driver.toString());
         } catch (SQLException e) {
             e.printStackTrace();
         }
     }
     Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
     Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
     for(Thread t:threadArray) {
         if(t.getName().contains("Abandoned connection cleanup thread")) {
             synchronized(t) {
                 t.stop(); //don't complain, it works
             }
         }
     }
 }
 public void contextInitialized(ServletContextEvent arg0) {
 }
}
web.xml中加
<listener>
    	<listener-class>com.southgis.grid.csgl.cas.ServletContextLTest</listener-class>
    </listener>


或者解决连接池的bug

package com.southgis.grid.csgl.cas;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
public class XBasicDataSource extends BasicDataSource{
 @Override
 public synchronized void close() throws SQLException{
//  System.out.println("......输出数据源Driver的url:"+DriverManager.getDriver(url));
  DriverManager.deregisterDriver(DriverManager.getDriver(url));
  super.close();
 }
}
修改applicationContext.xml文件:
<!--创建dataSource -->
	<bean id="dataSource" destroy-method="close" class="com.southgis.grid.csgl.cas.XBasicDataSource">
		<property name="driverClassName" value="${driverClassName}" />
		<property name="url" value="${url}" />
		<property name="username" value="${username}" />
		<property name="password" value="${password}" />
	</bean>

另外要修改tomcat软件bin目录下的catalina.bat文件

echo Using CATALINA_BASE:   "%CATALINA_BASE%"的前面加上

set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m


在tomcat目录/conf/context.xml的<Context>元素中增加属性antiJARLocking="true" antiResourceLocking="true"
如下所示
<Context antiJARLocking="true" antiResourceLocking="true">
。。。。。。
。。。。
</Context>

网上说dbcp连接池bug很多,所以就换了一个c3p0连接池

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 

        <property name="driverClass" value="${driverClassName}"/> 

        <property name="jdbcUrl" value="${url}" /> 

        <property name="user" value="${username}" /> 

        <property name="password" value="${password}" /> 

        <property name="minPoolSize" value="5" /> 

        <property name="maxPoolSize" value="30" /> 

        <property name="initialPoolSize" value="10"/> 

        <property name="maxIdleTime" value="60"/> 

        <property name="acquireIncrement" value="5" /> 

        <property name="maxStatements" value="0" /> 

        <property name="idleConnectionTestPeriod" value="60" /> 

        <property name="acquireRetryAttempts" value="30" /> 

        <property name="breakAfterAcquireFailure" value="true" /> 

</bean> 

pom.xml添加依赖

<dependency> 

   <groupId>c3p0</groupId> 

   <artifactId>c3p0</artifactId> 

   <version>0.9.1.2</version>   

</dependency> 

<dependency> 

   <groupId>org.hibernate</groupId> 

   <artifactId>hibernate-c3p0</artifactId> 

   <version>4.2.8.Final</version> 

</dependency> 

<dependency> 

 <groupId>c3p0</groupId> 

 <artifactId>c3p0-oracle-thin-extras</artifactId> 

<version>0.9.0.2</version> 

</dependency>   

经尝试,有时候能成功,有时候不能成功。还是不能彻底删除war包


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值