クラスタ化された環境でも同時に読み込みができないように、読み取り/書き込みロック付きのデータベースを使用することをお勧めします。
しかし、これはプロフィッショナルな解決策です。クラスター化されていない小さなアプリケーションを実行する予定の場合は、ServletContext、またはこのデータを含むStatic属性でさえ十分です。このデータの書き込み/読み出し方法は必ずsychronized
にしてください。
A非常に単純な例:
public static class MyApplicationSharedData {
private static ArrayList<String> locations = new ArrayList();
private static synchronized void writeLocation(String location) {
locations.add(location);
}
public static void waitForLocation(String location) {
while (locations.contains(location)) {
try {
Thread.sleep(1000);// sleep for a second while the location is bussy
} catch (InterruptedException e) {
log.error(e);
}
}
writeLocation(location);
}
public static synchronized void freeLocation(String location) {
locations.remove(location);
}
}
使用サンプル:どのようなセッション
MyApplicationSharedData.waitForLocation("Denver");
// Do stuff
MyApplicationSharedData.freeLocation("Denver");
? – assylias
データベースからのデータをキャッシュにロードできます。 DBに格納することはそれほど悪くないので、最終的にはデータはそこまでで終わるでしょう。読み取り時間を短縮するには、適切なインデックスを使用します。 –
私はリストではなくセットを使用し、いくつかのグローバルオブジェクトは同期メカニズムで使用します。 「グローバル」とは、環境によって異なります。 CDIが使用可能な場合は、アプリケーションスコープのBeanです。 – Thomas