0

次のことを行う必要がある C# でアプリケーションを作成しています。

データベースに接続せずに、データベースに新しいログがあるかどうかを確認する必要があります。存在する場合は、接続を開いて取得することができます。

したがって、データベースへの接続を開かずに、データベースに新しいログ (要素) があるかどうかを知る必要があります。

サーバーは管理者にメールを送信でき、メールボックスの変更を監視できますが、その解決策は受け入れられません。

新しい行を挿入するサーバーは、*.txt変更をダウンロードした後に確認および削除/編集できるテキスト表示の新しい行を含むファイルをディスク上に作成できますか?

(データベースは SQL Server 2008 R2 にあります)

それは可能ですか?これを行うための任意の/および/またはその他のオプションを歓迎します。

よろしくお願いします。

4

3 に答える 3

2

質問の下でのOPからの以下の明確なコメントに基づく:

30秒ごとに変更をチェックし、最新の認証を表示するWebアプリケーションがあります。データベースは従業員の承認を追跡しており、頻繁に更新されます。今、私はサーバーへのローカル接続があり、より頻繁に更新できるデスクトップアプリケーションを構築していますが、クライアントはアプリケーションに毎秒接続を開かせたくないので、アルド接続は数ミリ秒間開かれます。

適切な解決策はビジネスレイヤーだと思います。

アクセスに単一のデータベースユーザー(アプリケーションプールユーザーまたはWebアプリケーション内の偽装ユーザー)を使用してユーザーに代わってデータベースアクセスを実行するIISでホストされるビジネスレイヤーを構築する場合、接続プーリングにより接続数が減少します。データベースに大幅に作成されました。

これは、接続プールの仕組みと利点を詳細に説明しているMSDNの記事です。

Webレイヤーを含むすべてのクライアントは、WCFまたは.Net Remoting(.Netバージョンに応じて)を使用してビジネスレイヤーに接続し、ビジネスレイヤーはデータベースアクセスを実行する唯一のアプリケーションになります。

このアプローチの追加の利点は、DMZ内のすべてのデータベースアクセス(Webクライアントからのものを含む)を移動できるため、DMZから外部への直接のデータベースアクセスがないことです。これは、顧客にとって良いセールスポイントになる可能性があります。

このメカニズムは、非常に大規模で、セキュリティとパフォーマンスを重視するお客様に広く使用されています。

アップデート

別の方法として、ビジネスレイヤーで30秒ごとにデータベースにクエリを実行し、必要な情報を抽出して、ある種のデータベース(Access、SQL Server Expressなど)のビジネスレイヤーにローカルに保存することもできます。クライアントからのリクエストを受信すると、データベースではなくローカルデータストアからリクエストが処理されます。

これを行うには、global.asaxのApplication_Startイベントでバックグラウンドスレッドを開始するか、30秒ごとに期限切れになるキャッシュエントリを追加して、キャッシュタイムアウトイベントで作業を実行します。

これにより、接続数が30秒ごと(または時間に関係なく)に1(またはWebが変更されていない場合は2)に減少します。

于 2011-12-28T11:01:19.017 に答える
0

DB フォルダー内のファイルの変更日を監視してみてください。

于 2011-12-28T10:00:02.050 に答える
0

クライアント デスクトップ アプリケーションが大規模に展開されない場合は、SqlDependency. そうすれば、データベースを頻繁にポーリングする必要がなくなります。代わりに、何かが変更された場合にデータベースが通知します。

また、使用するサーバーにサービスを展開しSqlDependency、デスクトップ アプリケーションからこのサービスに接続することもできます。

それがオプションでない場合、このドキュメントでは他のオプションについて言及しています。

これらの 2 つは、状況に適用できます。

  • 監視対象のテーブルに AFTER UPDATE トリガーを作成します。このトリガーのアクションは、SQL Server Service Broker を使用して、通知が必要なエンティティにメッセージを送信します。
  • オブジェクトに登録したメモリ内オブジェクト キャッシュとコールバック関数に基づいて、変更通知メカニズムをサポートする Windows Server App Fabric Cache を使用します。
于 2011-12-28T10:12:16.680 に答える