1,在web.xml中加入以下代码:
<filter>
<filter-name>ConnectionMonitorFilter</filter-name>
<filter-class>com.servlets.ConnectionMonitorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ConnectionMonitorFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2, Filter的实现:
package com.servlets;
import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import com.common.ConnectionManager;
public class ConnectionMonitorFilter
implements Filter
{
public ConnectionMonitorFilter()
{
config = null;
}
public void init(FilterConfig config)
throws ServletException
{
this.config = config;
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws ServletException, IOException
{
String server = config.getInitParameter("server-name");
chain.doFilter(req, res);
HttpServletRequest request = (HttpServletRequest)req;
List list = ConnectionManager.getCurrentConnectonList();
if(list != null)
{
int count = 0;
int leak = 0;
for(Iterator it = list.iterator(); it.hasNext();)
{
count++;
try
{
Connection conn = (Connection)it.next();
if(!conn.isClosed())
if(ConnectionManager.isOpenByThread(conn))
{
leak++;
System.out.println("***** [WARN] A Connection Leak Problem Found At " + server + " - " + request.getRequestURL() + " ******");
conn.close();
} else
{
System.out.println("Found A Closed Connection Opened By Another Thread");
}
}
catch(Exception e)
{
System.out.println("***** [WARN] Exception Occured When Closing a Leaked Connection By MonitorFilter ******");
e.printStackTrace();
}
}
list.clear();
ConnectionManager.clear();
if(leak > 0 && !leakHistory.contains(request.getRequestURI()))
{
leakHistory.add(request.getRequestURI());
String msg = "***** <WARN> A Connection Leak Problem Found At " + server + " - " + request.getRequestURL() + " ******";
}
}
}
public void destroy()
{
}
public FilterConfig getFilterConfig()
{
return config;
}
public void setFilterConfig(FilterConfig filterconfig)
{
config = filterconfig;
}
private FilterConfig config;
public static ArrayList leakHistory = new ArrayList();
}