您可以ThreadLocal
在工厂模式中使用该类:
public class DataAccess{
private static ThreadLocal<DataAccess> THREAD_LOCAL = new ThreadLocal() {
@Override
protected DataAccess initialValue() {
return new DataAccess();
}
};
private String databasepath;
public static DataAccess getInstance() {
return THREAD_LOCAL.get();
}
}
但是,这将导致内存泄漏。因此,您需要使用Servlet 过滤器在请求开始时设置值,然后在结束时将其删除,例如:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
DataAccess.set(new DataAccess("SomeValue"));
try {
chain.doFilter(request, response);
} finally {
DataAcess.remove();
}
}
一旦你有一个class
实现过滤器的你将它添加到你的web.xml
因此:
<!--Filter for adding in dataccess objects-->
<filter>
<filter-name>DataccessFilter</filter-name>
<filter-class>my.package.DataccessFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DataccessFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
此页面提供了过滤器及其映射的示例。
你DataAccess
会看起来像:
public class DataAccess{
private static ThreadLocal<DataAccess> THREAD_LOCAL = new ThreadLocal();
private String databasepath;
public DataAcess(final String databasepath) {
this.databasepath = databasepath;
}
public static DataAccess getInstance() {
return THREAD_LOCAL.get();
}
public static void set(final DataAccess dataAccess) {
THREAD_LOCAL.set(dataAccess);
}
public static void remove() {
THREAD_LOCAL.remove();
}
}
要非常小心,ThreadLocal
因为它可能是 Java 中内存泄漏的第一大原因。对于具有线程池的 Web 服务器,如果您没有正确清除它们,您可能会遇到更严重的错误。