在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包