多くのユーザーが、多くの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を使用しないでください。
LDMをセッションに入れて何を達成しようとしていますか?それはいつ切り離されますか? – biziclop
セッションにはデタッチメソッドがあります。私たちはそこでそれを切り離す。 –