2

データベース処理を行う、頻繁に実行するメソッドが必要です。ただし、サイトの管理者がトリガーできるようにする必要がある場合があります。ただし、このメソッドを同時に複数回実行することは望ましくありません。これにより、データベースへのアクセス方法に問題が発生する可能性があるためです。

たとえば、私は...

タイマーでメソッドを実行するシングルトンクラスを作成し、global.asaxファイルでインスタンス化します。次に、シングルトンなので、通常の.aspxページから呼び出して、いつでもメソッドを呼び出すことができます。おそらく、C#の「ロック」機能を使用して、メソッドがすでに実行されているかどうかを確認する必要があります。

最近、シングルトンは「悪」であるという話を聞きましたが、これはそれにぴったりのようです。どう思いますか?前もって感謝します。

4

7 に答える 7

8

タイマーとロック(データベースへのアクセスを同期することを目的としています)は、Web上では悪い考えです。異なるサーバー上にゼロ、1つ、または多数のアプリプールがある場合があります。それらはいつでもリサイクルでき、必要になるまでスピンアップされません。基本的に、これは複数のソースからデータベースをハンマーで叩くことを妨げるものではありません。

個人的には、この作業を行うためのサービスを作成するか(db-pollingまたはWCFなどを介して)、db(SPなど)を使用するように誘惑されます-テーブル行にフラグを設定して「進行中」、データベースで作業を行い、フラグをクリアします(重複した試行は進行中にすぐに終了します)。

于 2009-03-20T13:40:55.700 に答える
1

私はこのようにします

  1. 処理を行う通常のASP.NETページを作成します
  2. プロセスが現在実行されているかどうかをチェックする作業を行うDB内のフラグの借入LFSRコンサルティングのアイデアを盗む
  3. 通常のcronjobまたはWindowsタスクスケジューラを使用して、定期的にWebページを呼び出します。

そして、シングルトンは悪ではなく、簡単に悪用されるだけです。

于 2009-03-20T13:45:28.607 に答える
1

SO Podcasts の 1 つで Joel Spolsky が言及した別のオプションは、#20 だったと思います。特定の有効期限のあるアプリケーションの開始時に空の Cache オブジェクトを設定し、CacheItemRemovedCallbackでページへの呼び出しを行うか、いくつかの作業を行ってから、空のキャッシュ オブジェクトをリセットします。

私はおそらくひどく誤って彼を引用しているので、自分でトランスクリプトを聞いたり、調べたりすることをお勧めします.

于 2009-03-20T14:00:43.343 に答える
0

シングルトンを書くための標準的な方法は、スレッドセーフではなくなります。特に、スレッドが同じマシン上にある必要がないWebby環境では!

本当に「シングルトン」を実行したい場合は、1台のマシンにのみ展開するサービスと考えてください。次に、Marc Gravellがロックの同期を提案するように、データベースのトランザクションセマンティクスを使用します。

于 2009-03-20T13:48:30.313 に答える
0

Webサービスを使用してバックエンド処理を実行し、必要なスケジュールで呼び出すデスクトップアプリを作成することで、同様のことを行いました。次に、そのアプリをサーバーで実行するか、管理者がPCから直接実行してジョブをトリガーすることができます。

編集:あなたがそれらをシミュレートして実行したくないというあなたの改訂を見た後、私たちは通常、他のいくつかが言ったようにデータベースフラグでそれを制御しました、何も派手ではありませんが、それは仕事を成し遂げます

于 2009-03-20T13:48:55.553 に答える
0

データベースにフラグを設定し、それをチェックしてジョブが実行されているかどうかを判断するのはどうですか?より単純なIMOのようです。

于 2009-03-20T13:40:01.147 に答える
0

アプリケーション全体の変数を設定して、プロセスが実行中であることを示します。変数をデータベースに格納するよりも少し簡単ですよね?

于 2009-03-20T14:42:01.653 に答える