24

アプリの開発の初期には、SqlDependency をかなり頻繁に使用して、通知がアプリに新しいコピーを取得するように指示するまで、DB の結果をキャッシュしていました。

テスト中に、SQL DB のパフォーマンスが SqlDependency 通知サービスによって打撃を受けていることがわかりました。SqlDependency を使用していたテーブルの数を減らしたところ、パフォーマンスが大幅に向上したことがわかりました。それで、私たちはそれを使い終わったと思って、先に進みました。現在、数テーブルしかありません。

その後、依存関係を確立するユーザー名のセキュリティ アクセス レベルを縮小できないことがわかりました。各 DB に複数の接続文字列 (依存関係用に 1 つ、残りのアプリ用に 1 つ) を設定できますが、複数の DB と DB ミラーリングを使用すると、(SQL DB 管理者の観点とアプリ開発の観点から) これは面倒です。

この時点で、次のロジックに基づいて、SqlDependency から完全に移行することを考えています。

  1. データが変更されたという「即時」通知は必要ありません。1 秒以内にわかっていれば、十分に高速です。
  2. 少しリファクタリングするだけで、テーブルを 1 つだけにして、そのテーブルを 1 秒に 1 回ポーリングすることができます。

このロジックに欠陥がある人はいますか?

1 つのテーブルを 1 秒に 1 回ポーリングすると、DB への負荷が SqlDependency よりも多かれ少なかれ発生しますか?

SqlDependency で同様のパフォーマンスの問題が発生した人はいますか?

4

1 に答える 1

12

私はあえてあなたの質問に答えようとします。しかし、あなたが望んでいた答えが得られるかどうかはわかりません...

90 年代初頭に、ボーランドが自社のデータベース Interbase で「コールバック」というこの壮大な新機能を宣伝したときのことを覚えています。これは、データベースが「アクティブ」になる可能性があるという約束がなされた非常に気の利いた新しい技術を介して発信者 (Delphi) に「通知」を提供します。 '。

これは後に「時間の無駄論」として知られるようになりました。

これが採用されなかった理由は、おそらく DBMS の概念が非常に有望に見えた一方で、データベースは階層の 1 つであり、水平方向にはスケールアップすることしかできないからだと思います。

したがって、プログラミング言語が助けになります。というか、サービス指向アーキテクチャ (SOA) の考え方です。多くの人が SOA を「Web サービス」と混同していますが、これは実際にこの新しい概念に盛り込まれた誇大広告でした。

しかし、Fiefdom/Emissary 設計パターン (またはよりクールでプロフェッショナルに聞こえるように名前を変更した Master/Agent パターン) を調べると、主なアイデアはそのリソース (データベースの読み取り) を排他的に制御し、すべての呼び出しが1 つのデータ アダプターを介して集中的に送信されます。

明らかに、そのような設計は、トリガーやコールバック フレームワークではまったく機能しません。

しかし、デザイン全体を再考する必要があると思います。おそらくEntity Frameworkを使用し、おそらくその上にキャッシュメカニズムを使用して、単一の「DataLayer」を介してすべてのアクションとすべての呼び出しをファネルすると、メッセージを食物連鎖にバックアップするためにデータベースに依存する必要がなくなります。

「データベース中心」になるといかに奇妙なことが起こり得るかを示すために、電子メールを送信しない方法の極端な実際の例を示します。これは、私があまり感心していなかったコーダーによってずっと前に書かれたものです。

事実 1: Sql Server は電子メールを送信できます。

事実 2: Asp3 コーダーは、VbScript でこれを実行できるかどうか、またはその方法を知りません。

Asp3: テキスト ボックスの電子メール アドレスを読み取り、com+ レイヤーに送信する

Com+: メールアドレスを受け取り、データレイヤーに転送する

Datalayer: 電子メール アドレスを取得してストアド プロシージャに転送する

Sproc: メールアドレスを受け取り、SQL 関数に転送する

関数: 電子メール アドレスに @ が含まれていることを確認するために、奇妙な部分文字列処理を実行します。初期化。true または false を返します。

Sproc: 1 列と 1 または 0 を含む 1 行のレコードセットを返します

Datalayer: テーブルをそのまま返します。

Com+: 値が 1 または 0 の最初の列と行を true または false に変換します

Asp3: true の場合、電子メールの件名と電子メールのテキストを含む電子メール アドレスを com+ に送信します。

Com+: 正確な情報をデータレイヤーに送信します

Datalayer: ストアド プロシージャを呼び出します。

Sproc: SQL 関数を呼び出します...

関数: SQL サーバーの電子メール エージェントを使用して電子メールを送信します。

ここまで読んだ場合、SQL Server にテーブル、リレーション、インデックス、およびトランザクションを管理させることをお勧めします。それがとても上手です。これらのタスクを超えるものはすべて、ストアド プロシージャにカーソルを含めますが、適切なコードを使用することでより適切に処理できます。

于 2013-01-15T19:23:33.190 に答える