2016-12-21 44 views
3

Web APIプロジェクトのCRM SDKのCrmServiceClientの使用方法を理解し、理解が正しいかどうか確認したいと考えています。Web ApiプロジェクトでのCrmServiceClientの再利用または接続プーリング

CrmServiceClientが接続プーリングを実装するのは本当ですか?その場合、CrmServiceClientによって新しい接続を作成するオーバーヘッドが緩和されるため、Webリクエストごとに新しいインスタンスを作成するだけですか?

また、アプリケーション全体でCrmServiceClientのインスタンスを1つ使用する必要がありますか?私はそれがスレッドセーフではなく、最終的に接続が閉じる(私は思う)ということが私の理解であるため、これはうまくいくとは思わない。

答えて

1

それはdocumentation for CrmServiceClientで述べている:

スレッドセーフ
(Visual BasicではShared)すべてのパブリックstaticこのタイプのメンバーは、スレッドセーフです。どのインスタンスメンバーもスレッドセーフであるとは限りません。

(強調私自身)

私は確かに私のアプリケーション全体CrmServiceClientの1つの静的インスタンスを使用して問題を経験したことがありません。

+0

パブリックな静的メンバーだけがスレッドセーフであると言います。 CrmServiceClientインスタンスを使用してXrmServiceContextのインスタンスを作成すると、静的でないインスタンスメンバーの一部が呼び出されることはありませんか? CrmServiceClientによって行われた接続は、一定期間休止しても終了しないか、タイムアウトしませんか?私の心配は、私が再利用すれば、接続がまだ開いているかどうかを何とか確認する必要があるかどうかです。 – tacobell

+0

すべてのコンストラクタはスレッドセーフです。https://msdn.microsoft.com/en-gb/library/dn688177.aspx接続ステータスを確認します。https://msdn.microsoft.com/en-gb/library/dn688177 .aspx#決定 – Equalsk

+0

私は、初期接続要求が成功したときにIsReadyがtrueに設定されていると考えます。長い時間が経過して接続が成功した後で閉じることはできませんか? – tacobell

0

ここで述べたようにCrmServiceClientはスレッドセーフです。https://msdn.microsoft.com/en-us/library/dn688177.aspxCrmServiceClientクラスを使用するDynamics 365の呼び出しはすべてスレッドセーフです。

私が取り組んでいるアプリケーションでは、アプリケーション全体で使用されるCrmServiceClientの1つのインスタンスがキャッシュされています。それを使用する前にIsReadyプロパティをチェックします。この単一インスタンスは、アプリケーション全体で(ブロックを使用して)XrmServiceContextインスタンスをインスタンス化するために使用されます。

また、私のテストでは、接続プーリングはCrmServiceClientによって実行されたものではないようです。私はAPIエンドポイントを100回呼び出したテストを行い、各呼び出しでCrmServiceClientのインスタンス化時間はほぼ同じままです。私は間違っている可能性がありますが、接続プーリングを実行しないと思っています。

0

実際に接続がプールされています。アプリケーション全体で単一の接続を使用するのが一般的ですが、目的に応じて選択します。接続文字列に "RequireNewInstance = True"を追加すると、使用するたびに新しい接続が作成されます。私は通常、より多くのデータを同時にプッシュする必要がある統合を作成するときにのみこれを実行します。

+0

私はRequireNewInstance = trueを持っておらず、接続をプールすることは決してありません。興味深い、あなたは何か情報源を持っていますか? – tacobell