おはようございます。私は現在、Web サービス インターフェイスを公開する Java Web アプリケーションを開発しています。グローバル オブジェクトをメモリに保持するために、次のクラスをシングルトンとして使用します。
public class SingletonMap {
private static final SingletonMap instance = new SingletonMap();
private static HashMap couponMap = null;
private static long creationTime;
private SingletonMap() {
creationTime = System.currentTimeMillis();
couponMap = new HashMap();
}
public static synchronized SingletonMap getInstance() {
return instance;
}
public static long getCreationTime() {
return creationTime;
}
}
Web サービスのすべてのスレッドに対して HashMap の同じインスタンスを作成するために、上記のクラスを使用しています。SingletonMap オブジェクトを維持する Web サービス クラスは次のとおりです。
@WebService()
public class ETL_WS {
private String TOMCAT_TEMP_DIR;
private final int BUFFER_SIZE = 10000000;
private static SingletonMap couponMap;
private static SingletonProductMap productCategoryMap;
private String dbTable = "user_preferences";
public ETL_WS() {
Context context = null;
try {
context = (Context) new InitialContext().lookup("java:comp/env");
this.TOMCAT_TEMP_DIR = (String) context.lookup("FILE_UPLOAD_TEMP_DIR");
}catch(NamingException e) {
System.err.println(e.getMessage());
}
public long getCouponMapCreationTime() {
return couponMap.getCreationTime();
}
}
メソッド getCouponMapCreationTime() を使用する理由は、Web サービスのすべてのスレッドが同じオブジェクトにアクセスしていることを確認するためです。上記のアプローチは正しいですか?パフォーマンスのオーバーヘッドはどうですか? Singleton プロパティが必要だと思いますか、それともすべてのスレッドに静的な HashMap を使用できますか? 静的な HashMap を使用すると、アクティブなスレッドがない場合にガベージ コレクションが行われますか?
お時間をいただきありがとうございます。