您可以使用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 Filter設定值在請求開始,然後在年底將其刪除,有的像:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
DataAccess.set(new DataAccess("SomeValue"));
try {
chain.doFilter(request, wrapper);
} finally {
DataAcess.remove();
}
}
一旦你有一個class
實現Filter你把它添加到您的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>
This page給出了一個過濾器及其映射的例子。
和你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服務器,如果不正確地清理它們,可能會出現更嚴重的錯誤。
你有9個問題,並接受0.請改善它。 – gaborsch 2013-02-19 14:15:59
我該如何接受答案 – 2013-02-19 14:27:09
閱讀本章常見問題解答,甚至有截圖:http://stackoverflow.com/faq#howtoask – gaborsch 2013-02-19 14:34:07