SQL Serverデータベース、ASP.NET Web API 2.2サービス、およびその他の外部サービスを備えた大きなシステムを開発しています。
テーブルの現在のデータを処理している間、テーブルにさらに多くのデータをロードする必要があります。バックグラウンドでデータをロードできるようにするには、CLR SQL ServerストアドプロシージャからASP.NET Web APIを呼び出します。
次に、ASP.NET Web APIがより多くのデータを取得し、それ自体がSQL Serverにそのデータを挿入します。
プロセスの説明は次のとおりです。
この「アーキテクチャ」についてどう思いますか?より良いアプローチを知っていますか?
ここでの疑問は2番目のステップです。SQLServerデータベースがASP.NET Web APIを呼び出します。しかし、その作業はバックグラウンドで行う必要があります。
また、SQL Serverに挿入する必要のある新しいデータは、WCF SOAP Service。
私はCLRアセンブリがこのように使用される場所で働いてきました。私の意見では、それは悪い考えです。
ここに私の推論があります。
1:データベースにロジックを埋め込むことは常に悪いことです。これは「プログラミング哲学」の立場ですが、原則として正当化されていると感じています
2:CLRはmssqlサーバー上の.net 2に制限されます
3:CLRは、外部リソースへの依存関係が原因でタイムアウトまたはエラーになる場合があります。これにより、sprocから異なる結果セットが生成されます
4:DBが選択しますか?次に、挿入するAPIを呼び出すと、簡単な解決策ではなく、ロックとトランザクションの問題が発生します。
5:ソリューション(webapi)に.Netレイヤーがすでにあるので、Windowsサービスや、ビジネスの役割を果たすことができる同様のアプリケーションをサポートするインフラストラクチャがあります。
私がより良いパターンを提案できるようにするためにあなたの質問に欠けているのは、そもそもsprocを呼び出しているものだと思いますか?
私はそれが論争になる可能性があることを知っているので、ポイント1のただの迅速な拡張。私は多くの企業で働いており、2種類のシステムを目にする傾向があります。
DBAによって最初に作成されたシステム。これらは多くのSQLエージェントジョブ、caseステートメントを含む大きなsproc、ループとビジネスロジック、SSISパッケージなどを持つ傾向があります
プログラマーによって最初に作成されたシステム。これらには、インデックスやキー、xml列などがない傾向があります。DBは、オブジェクトの永続化に使用されるだけです
DBAが作成したシステムは、拡張性がないためフォールオーバーします
プログラマシステムは破損したデータを取得しますが、苦労します。いつでも別のWebボックスを追加できるため
Ewanの回答に基づいて、CLRを使用せずに作業を行う方法を提案できます。
1)追加のデータが必要かどうかをチェックするジョブ(Windowsサービス、スケジュールされたタスクによって実行されるアプリケーションなど)を作成します
2)Web.APIを呼び出してジョブからデータをフェッチします
3)ジョブで処理を行います。ロジックが複雑な場合、C#はSQLよりもはるかに優れています
4)ジョブからのデータを永続化します。持続性は、パフォーマンスを向上させるために BulkInsert を使用して実行できます。
C++、C#、Javaなどの高水準言語は、ほとんどの場合、ビジネスロジックの定義に使用するのに適しています。反復的なケースではるかに優れたパフォーマンスを発揮し、OOP、高度なログ、例外管理、デバッグなどを許可します。 。
ストアドプロシージャを移行できない場合でも、次のように作業を行うことができます。
3)フェッチされたデータを、処理セッション識別子を持ついくつかのバッファテーブルに永続化します。フェッチされたデータ量が多い場合、一括挿入はあなたの友人です
4)処理セッション識別子を使用してプロシージャを呼び出します。プロシージャは、バッファテーブルからデータを取得します
5)データ量が非常に多い場合、削除はパフォーマンスに大きな影響を与えるため、使用率の低い期間にバッファテーブルを空(切り捨て)にすることができます。