2012-01-27 15 views
1

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サービスインスタンスの同時実行の問題のいくつかの並べ替えをオブジェクトと

    • 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

  • 答えて

    1

    のためにあなたは、 'プロトタイプ' オブジェクトとしてServiceHostFactoryによってエクスポートあなたのサービス、すなわちないシングルトンを宣言しましたWCFインスタンス化と正しく相互作用するか?

    <object id="calculator" singleton="false" type="Spring.WcfQuickStart.CalculatorService, Spring.WcfQuickStart.ServerApp"> 
        <property name="SleepInSeconds" value="1"/> 
    </object> 
    
    +1

    hi bbaia、エクスポートされたサービス自体はプロトタイプです。しかし、サービス(Daoのもの)の依存関係は、プロトタイプではなくシングルトン*です。サービスとその依存グラフ全体がプロトタイプである必要がありますか?もしそうなら、私のDAOのシングルトンの動作に依存するアプリケーションの他の部分を壊さずに、どうすればいいですか? –

    +0

    消費されたサービスは、スレッドセーフである場合に限り、シングルトンにすることができます。彼らは? Spring.netは、インスタンスごとにグラフのスコープをサポートしていません。私は通常、プロトタイプの範囲で私のDAOを宣言します。あなたのアプリはシングルトン行動のどの側面に依存していますか? – Marijn

    +0

    私のシングルトンは、確実にスレッドセーフです(完全にステートレスです)。私は、Spring.NETのトランザクション管理もスレッドセーフであると想定していますか? –

    関連する問題