2016-09-08 8 views
0

2人以上のユーザーが複数の場所を使用して商品をアンロードする場合がありますが、そのうちの1つだけが1つの場所でアンロードされ、彼が終わるまで(彼らは同じ場所で降ろすための命令を持っている)。異なるセッション間でストリングアーリーリストの値を共有する

私はarraylist occupiedLocationsに場所の名前を格納することを考えていましたが、ユーザーが場所を入力して終了するときに場所の名前を削除する前に場所が占有されているかどうかをチェックしますが、 arraylistの内部は、異なるセッション間で共有されていません。 データベースに値を格納することは可能ですが、データベースからの書き込み/読み取りを必要としない別のオプションがあります。

+0

? – assylias

+0

データベースからのデータをキャッシュにロードできます。 DBに格納することはそれほど悪くないので、最終的にはデータはそこまでで終わるでしょう。読み取り時間を短縮するには、適切なインデックスを使用します。 –

+0

私はリストではなくセットを使用し、いくつかのグローバルオブジェクトは同期メカニズムで使用します。 「グローバル」とは、環境によって異なります。 CDIが使用可能な場合は、アプリケーションスコープのBeanです。 – Thomas

答えて

0

クラスタ化された環境でも同時に読み込みができないように、読み取り/書き込みロック付きのデータベースを使用することをお勧めします。

しかし、これはプロフィッショナルな解決策です。クラスター化されていない小さなアプリケーションを実行する予定の場合は、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"); 
+0

私はそれらをすべて別のクラスに入れてくれました。ありがとうございました。 –

+0

デッドロックには注意が必要です。これは非常に簡単な例です –

関連する問題