ファクトリ パターンでクラスを使用できます。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();
}
}
ただし、これによりメモリ リークが発生します。したがって、サーブレット フィルターを使用して、リクエストの開始時に値を設定し、最後にそれを削除する必要があります。
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();
}
}
Filterclass
を実装する を取得したら、それを次のように追加します。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();
}
}
これはおそらく Java でのメモリ リークの最大の原因であるため、細心の注意を払ってください。ThreadLocal
スレッド プールを備えた Web サーバーでは、適切にクリーンアップしないと、さらに深刻なバグが発生する可能性があります。