WebアプリケーションでSpring.NETの宣言型トランザクションを問題なく使用しています。トランザクションアドバイスは、サービスレイヤメソッドにのみ適用されます。WCF + Spring.NETが断続的なSystem.Transaction例外を発生させる
最近、Spring管理サービスオブジェクトを依存関係として使用する2つのWCFサービスが導入されました。 Spring.ServiceModel.Activation.ServiceHostFactory
を使用して、Spring.NETのサンプルごとにこれらのサービスをインスタンス化します。
これらのサービスを本番環境に配備した直後に、Springのトランザクションを管理するクラスAdoPlatformTransactionManager
から断続的なエラーが発生しました。
エラーテキストは次のとおり
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Transaction'.
at System.Transactions.Transaction.get_IsolationLevel()
at System.Transactions.TransactionScope..ctor(TransactionScopeOption scopeOption, TransactionOptions
at AdoPlatformTransactionManager.DoBegin(Object transaction, ITransactionDefinition definition)
at Spring.Transaction.Support.AbstractPlatformTransactionManager.GetTransaction(ITransactionDefinition definition)
これらのエラーは断続的であり、現在のサーバの負荷(より多くのユーザー= REPROのより高い可能性)と相関見えます。さらに、WCF以外のサービス開始呼び出しでは、このような例外は見られませんでした。これまでのところ、私は上に行くために2つの非常に不安定な説があります:シングルトンサービスは
- WCFオブジェクトのインスタンス化/スコープ(PerCall)がうまく再生されません(スレッドローカルストレージ?)
このエラーを検出し、ほとんど無駄になっているSpring.NETサポートフォーラムを検索すると何も得られなかったので、何か助けやアイデアは感謝しています!
アップデート1
もう少しデバッグを行なったし、問題の周りに多くの明快さを得ました。実際の問題は、トランザクションに関連するものではなく、障害の発生した状態からWCFチャネルを回復することに関するものです。
WCFメソッド呼び出し中に処理されない例外がスローされている場合(私の場合はFK違反でした)、チャネルは永続的なフォールト状態のままです。
さらに悪いことに、チャンネルがフォールト状態になると、Spring.NETはユーザーごとに新しいチャンネルを作成しないため、そのサービスのすべてのユーザーに影響します。この問題を解決する唯一の方法は、アプリケーションプールをリサイクルすることです。
以下の参照先のリンクに基づいて、問題がSpring.NETにあるのか、一般的なWCFフォールトであるのか、まったく別のものであるのかどうかはわかりません。
参照
client-timeout-when-using-wcf-through-spring-net
Best-Practices-and-Recover-a-Faulted-Channel
what-is-the-best-workaround-for-the-wcf-client-using-block-issue
hi bbaia、エクスポートされたサービス自体はプロトタイプです。しかし、サービス(Daoのもの)の依存関係は、プロトタイプではなくシングルトン*です。サービスとその依存グラフ全体がプロトタイプである必要がありますか?もしそうなら、私のDAOのシングルトンの動作に依存するアプリケーションの他の部分を壊さずに、どうすればいいですか? –
消費されたサービスは、スレッドセーフである場合に限り、シングルトンにすることができます。彼らは? Spring.netは、インスタンスごとにグラフのスコープをサポートしていません。私は通常、プロトタイプの範囲で私のDAOを宣言します。あなたのアプリはシングルトン行動のどの側面に依存していますか? – Marijn
私のシングルトンは、確実にスレッドセーフです(完全にステートレスです)。私は、Spring.NETのトランザクション管理もスレッドセーフであると想定していますか? –