web-dev-qa-db-ja.com

ASP.NET Web APIを呼び出すCLR SQL Serverストアドプロシージャ

SQL Serverデータベース、ASP.NET Web API 2.2サービス、およびその他の外部サービスを備えた大きなシステムを開発しています。

テーブルの現在のデータを処理している間、テーブルにさらに多くのデータをロードする必要があります。バックグラウンドでデータをロードできるようにするには、CLR SQL ServerストアドプロシージャからASP.NET Web APIを呼び出します。

次に、ASP.NET Web APIがより多くのデータを取得し、それ自体がSQL Serverにそのデータを挿入します。

プロセスの説明は次のとおりです。

  1. SQL Serverストアドプロシージャは、さらにデータが必要であることを検出し、CLR SQL Serverストアドプロシージャを呼び出します。
  2. CLR SQL Server SPはASP.NET Web APIを呼び出します。
  3. ASP.NET Web APIは、より多くのデータを取得してSQL Serverに挿入します。

この「アーキテクチャ」についてどう思いますか?より良いアプローチを知っていますか?

ここでの疑問は2番目のステップです。SQLServerデータベースがASP.NET Web APIを呼び出します。しかし、その作業はバックグラウンドで行う必要があります。

また、SQL Serverに挿入する必要のある新しいデータは、WCF SOAP Service。

2
VansFannel

私は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ボックスを追加できるため

1
Ewan

Ewanの回答に基づいて、CLRを使用せずに作業を行う方法を提案できます。

1)追加のデータが必要かどうかをチェックするジョブ(Windowsサービス、スケジュールされたタスクによって実行されるアプリケーションなど)を作成します

2)Web.APIを呼び出してジョブからデータをフェッチします

3)ジョブで処理を行います。ロジックが複雑な場合、C#はSQLよりもはるかに優れています

4)ジョブからのデータを永続化します。持続性は、パフォーマンスを向上させるために BulkInsert を使用して実行できます。

C++、C#、Javaなどの高水準言語は、ほとんどの場合、ビジネスロジックの定義に使用するのに適しています。反復的なケースではるかに優れたパフォーマンスを発揮し、OOP、高度なログ、例外管理、デバッグなどを許可します。 。

ストアドプロシージャを移行できない場合でも、次のように作業を行うことができます。

3)フェッチされたデータを、処理セッション識別子を持ついくつかのバッファテーブルに永続化します。フェッチされたデータ量が多い場合、一括挿入はあなたの友人です

4)処理セッション識別子を使用してプロシージャを呼び出します。プロシージャは、バッファテーブルからデータを取得します

5)データ量が非常に多い場合、削除はパフォーマンスに大きな影響を与えるため、使用率の低い期間にバッファテーブルを空(切り捨て)にすることができます。

1
Alexei