2016-05-25 6 views
0

多くのユーザーが、多くのajax呼び出しを受けたページに当たるという問題がありました。実行に時間がかかり、最終的にLoadableDetachableModelにスレッドの問題が発見されました。LoadableDetachableModelマルチスレッドの問題

私はこの問題は、セッション内にUserModelがあるという事実に関連していると思います。このUserModelは、LoadableDetachableModelを拡張します。 load()メソッドが返すには時間がかかりすぎると、load()が呼び出される前でtransientModelObjectが設定される前に、attachフラグがtrueに設定されているという事実に基づいて、これを修正するために、必要に応じて同期を追加する独自の修正バージョンのLoadableDetachableModelを作成しました。それ以来、私たちはこれ以上の問題はありませんでした。

私はWicket Jiraサイトを見回し、魚釣り内のいくつかのコミットを見て、Wicket 7にフラグがついていないことに気づいたので、この問題が修正されたかどうかを確認しました。代わりに、WICKET-5916を修正するためにInternalStateと呼ばれる列挙型があります。スレッドの問題はまだWicketの7.2バージョンに存在しているようです。ここでは、コードです:

@Override 
public final T getObject() 
{ 
    if (state == null || state == InternalState.DETACHED) 
    { 
     // prevent infinite attachment loops 
     state = InternalState.ATTACHING;//<--One thread sets this, next thread gets a null object returned since load() has not completed 

     transientModelObject = load(); 

     if (log.isDebugEnabled()) 
     { 
      log.debug("loaded transient object " + transientModelObject + " for " + this + 
       ", requestCycle " + RequestCycle.get()); 
     } 

     state = InternalState.ATTACHED; 
     onAttach(); 
    } 
    return transientModelObject; 
} 

あなたが見ることができるように、単一のスレッドがのgetObject()を呼び出し、回線コーリング負荷になれば()、モデルが付着して状態変数セットを持っています。次のスレッドは、load()が完了する前にgetObject()を呼び出し、stateがNULLでなくstateがDETACHEDではないため、nullオブジェクトを返します。

また、これは、複数のスレッドが同じモデルを再利用できる、セッションまたはアプリケーションクラスでLoadableDetachableModelを使用している場合にのみ発生する可能性があると思います。

何か不足しているか、バグレポートを提出する必要がありますか?セッションでLoadableDetachableModelを使用しないでください。

+0

LDMをセッションに入れて何を達成しようとしていますか?それはいつ切り離されますか? – biziclop

+0

セッションにはデタッチメソッドがあります。私たちはそこでそれを切り離す。 –

答えて

3

IModelは、コンポーネントで使用されるインターフェイスであり、すべてのコンポーネントはシングルスレッドです。 セッションまたはアプリケーションでモデルを使用しないでください。

+1

したがって、セッションにユーザーを保持するための推奨される方法は、セッションが切り離されたときに切り離される一部のIModel経由ではありませんか?私はそれが良いと思いますが、私は10年前からそうしてきました。 LoadableDetachableModelのアイデアは、リクエストごとにユーザーをロードするためには完璧に機能しますが、私たちが持っていた経験とあなたの反応を考えた上で、フライウェイトパターンを使用し、軽量シリアル化可能なバージョンのユーザーとストアを作成する方が良いと考えていますユーザーがログインしたときに表示されます。 –

+0

途中であなたの答えをありがとう。時間がある場合は、セッションにユーザーを保存するためのベストプラクティスがあれば教えてください。私たちの製品のユーザーの1つであるwicket-auth-rolesとそれ以外はありません。 auth-roleを使用しないものが問題を抱えています。 –

+0

あなたのページでLDMを使用することができます.LDMを使用すると、セッションからユーザーの識別子がフェッチされ、データベースから完全なフルエッジエンティティがロードされます。このような設定では、スレッドの問題は発生しません。 – svenmeier

関連する問題