2009-03-20 3 views
2

Ich brauche eine Methode, die manchmal ausgeführt wird, die einige Datenbankverarbeitung ausführt. Allerdings muss es möglicherweise von einem Administrator auf der Website aktiviert werden. Aber ich möchte nicht, dass diese Methode mehr als einmal zur gleichen Zeit ausgeführt wird, da dies zu Problemen beim Zugriff auf die Datenbank führen kann.Wie wird ein Job implementiert, der jede Stunde ausgeführt wird, aber auch von ASPX-Seiten ausgelöst werden kann?

Zum Beispiel könnte ich ...

eine Singleton-Klasse erstellen, die das Verfahren auf einem Timer läuft, und es in der Datei global.asax instanziiert. Da es ein Singleton ist, kann ich es von meinen normalen ASPX-Seiten aus aufrufen und die Methode aufrufen, wann immer ich will. Ich würde wahrscheinlich diese "Lock" -Funktion von C# verwenden müssen, um zu überprüfen, ob die Methode bereits ausgeführt wird.

Ich habe in letzter Zeit gehört, dass Singletons "böse" sind, aber das scheint die perfekte Lösung dafür zu sein. Was denken Sie? Danke im Voraus.

+0

Warum die Datenbank für die Flagge verwenden? Könnte ich nicht einfach die Application-Klasse verwenden? Anwendung ["DBCleanupRunning"] = true; Das wäre für meine einfache Webanwendung viel einfacher. Funktioniert das? –

Antwort

8

Timer und Sperren (die den Zugriff auf die Datenbank synchronisieren sollen) sind eine schlechte Idee im Internet; Sie können null, einen oder viele App-Pools auf verschiedenen Servern haben. Sie können jederzeit recycelt werden und werden erst bei Bedarf wieder in Betrieb genommen. Grundsätzlich verhindert dies nicht, dass Sie die db aus mehreren Quellen hämmern.

Persönlich würde ich versucht sein, entweder einen Dienst zu schreiben, um diese Arbeit zu tun (entweder db-polling oder über WCF usw.), oder die db (a SP o.ä.) zu verwenden - ein Flag in einer Tabelle setzen- Zeile, um "in Bearbeitung" zu sagen, die Arbeit an der Datenbank ausführen und die Markierung löschen (doppelte Versuche werden sofort beendet, während sie ausgeführt werden).

0

Wie wäre es mit der Einrichtung eines Flags in der Datenbank und der Überprüfung, ob der Job ausgeführt wird oder nicht? Scheint einfacher IMO.

1

Ich würde es auf diese Weise tun

  1. eine normale ASP.NET-Seite bauen, die funktioniert die Verarbeitung
  2. LFSR Consultings Idee für eine Flagge in der DB Borrow Steal, das macht die Arbeit zu überprüfen, ob die Prozess läuft gerade
  3. Verwenden Sie normalen Cronjob oder Windows Taskplaner, um die Webseite regelmäßig aufzurufen.

Und Singletons aren't evil sie nur einfach missbraucht werden.

+0

Ahh Kredit, wo Kredit fällig ist! : P –

0

Der kanonische Weg, einen Singleton zu schreiben, ist nicht threadsicher. Vor allem in einer Webby-Umgebung, in der Threads nicht einmal auf derselben Maschine sein müssen!

Wenn Sie wirklich wollen ein "Singleton" zu tun, denken Sie an es als ein Service, den Sie nur auf einer Maschine bereitstellen. Dann verwenden Sie die transaktionale Semantik Ihrer Datenbank, wie Marc Gravell vorschlägt, um die Sperren zu synchronisieren.

0

Wir haben ähnliche Dinge getan, indem wir einen Web-Service für die Backend-Verarbeitung verwendet haben und dann eine Desktop-App geschrieben haben, um sie in dem von uns benötigten Zeitplan aufzurufen. Wir können diese App dann auf einem Server ausführen, oder ein Administrator kann sie direkt von ihrem PC aus starten, um den Job auszulösen.

Edit: Nachdem ich sah Ihre Revision, dass Sie sie simulatenously laufen nicht wollen, haben wir in der Regel nur gesteuert, dass mit einer Datenbank Flagge wie ein paar andere gesagt haben, nichts Besonderes, aber es wird die Arbeit getan

1

Eine andere Option, die Joel Spolsky in einem der SO Podcasts erwähnt hat, ich glaube es war # 20 etwas. Legen Sie ein leeres Cache-Objekt beim Start der Anwendung mit einem bestimmten Ablaufdatum fest, und rufen Sie in der CacheItemRemovedCallback einen Aufruf auf der Seite auf oder machen Sie etwas Arbeit und setzen Sie das leere Cache-Objekt zurück.

Ich bin wahrscheinlich schrecklich falsch zitiert ihn, so empfehle ich Ihnen listen oder die Transkripte für sich selbst schauen.

+0

Verwendet die Cache-Klasse wie die Verwendung der Application-Klasse? –

+0

Sie würden den Cache für ein Anwendungsereignis in Global.asax oder einer zufälligen Seitenklasse einrichten, und die Cache-Klasse wird zum Hinzufügen eines leeren Objekts und zum Behandeln von ItemRemovedCallback verwendet. – bendewey

0

eine Anwendung weite Variable Stellen zu bezeichnen, dass der Prozess ausgeführt wird. Das sollte etwas einfacher sein als das Speichern der Variablen in der Datenbank, oder?

+0

Wenn Sie ein Singelton verwenden, ist es der gleiche Unterschied. Wie von Marc oben vorgeschlagen, wäre es jedoch besser, einen Webdienst anstelle einer Webanwendung zu verwenden, um die geplante Aufgabe auszuführen. –

Verwandte Themen