2016-11-03 10 views
1

異なるWARSがデプロイされたクラスタ化されたWebアプリケーションを開発しているので、セッションの共有が必要です。私はIgniteをClustered(Replicated)キャッシュサーバーのための良いプラットフォームとして使用し始めました。 私のキャッシュキーは文字列で、値は、私がWEBSESSIONとして、このキャッシュを使用していますHashMapのApache Igniteに格納されたHashmapの同時実行に関する問題

CacheConfiguration<Integer, Map<String,String>> cfg = new CacheConfiguration<>("my_cache"); 

です:私は達し 問題はこれです。この問題は、サーブレットがマップを取得し、セッション固有の値をいくつか入れて、Igniteに戻すところです。最初のサーブレットがキャッシュを取得した後、2番目のサーブレットが入ると、最初のサーブレットの後に終了するため、2番目のputは最初の1つの変更を強制終了します。

私の正確な質問は、同時マップアクセスの問題を解決するパターンは、(オブジェクト全体をロックすることなく)効率的な方法です。

よろしく

答えて

0

2つが同じセッションで動作する2つの同時要求がある場合、このシナリオにのみ可能でなければなりませんので、それは、私には少し奇妙に聞こえます。これはどのように可能ですか?

いずれにしても、ウェブセッションデータにはTRANSACTIONALキャッシュを使用できます。これにより、これら2つの要求がロック内で処理され、データがアトミックに更新されることが保証されます。

<bean class="org.apache.ignite.configuration.CacheConfiguration"> 
    <property name="name" value="web-sessions-cache"/> 
    <property name="atomicityMode" value="TRANSACTIONAL"/> 
</bean> 
+0

あなたの答えはバレンタインですが、正しくありません。 次のシナリオを考えてみましょう。 Servlet_DoGet_Method(){ Map session = cache.get( "token"); session.get( "some_session_key"); long_running_task_onDB(); open_close_files(); session.put( "some_session_key"、1000); cache.put( "token"、session); } このサーブレットgetメソッドの実行中に、誰かがトークンセッションマップを取得した場合、値が1000のマップではなく、まだOLDマップではなく、最初のメソッドが終了し、2番目のメソッドが失われてしまうので、some_session_keyの変更地図上 –

+0

あなたが言ったように、私はTRANSACTIONALキャッシュモードを使うと、最後に何が起こるのですか?2つ目はトランザクションをコミットするでしょうか?例外?上書き(トランザクションなしのように)? –

+0

IgniteのWebセッションクラスタリング(https://apacheignite.readme.io/docs/web-session-clustering)を使用していますか?そうであれば、リクエストはトランザクション内で処理され、読み込み時にロックを取得します。これを手動で行う場合は、自分でトランザクションを開始してください。ここで読んでいる取引についての情報:https://apacheignite.readme.io/docs/transactions –

関連する問題