Frage

Ich habe eine Version von Doppeln checked Verriegelung in meiner CF App verwendet (bevor ich wusste, was doppelt geprüft Verriegelung war).

Im Wesentlichen, überprüfe ich für die Existenz eines Objekts. Wenn es nicht vorhanden ist, sperre ich (in der Regel eine benannte Schloss) und bevor ich versuche, und erstellen Sie das Objekt, das ich wieder für existance überprüfen. Ich dachte, das eine nette Art und Weise war, mehr Objekte zu stoppen und übermäßige Verriegelung im System zu stoppen erstellt werden.

Das scheint zu funktionieren, dass es nicht zu hoch Schließ- und Objekt Duplikate ist nicht bekommen, erstellt. Allerdings habe ich vor kurzem erfahren, dass Doppelverriegelung Karo dosn't Arbeit in Java , was ich nicht weiß, ist, wenn dies im CF gilt, wie CF Fäden zu sehen und Schlösser sind nicht ganz die gleiche wie native Java-Threads und Sperren.

Keine korrekte Lösung

Andere Tipps

So fügen Sie auf, was Ben Doom sagte über Java, das ist ziemlich gängige Praxis in Coldfusion, und zwar mit einer Anwendung Initialisierungsroutine, wo Sie Ihre Anwendungsvariablen einrichten.

Ohne mindestens eine Sperre aufweist, lässt du die ersten Zugriffe auf Ihre Web-Anwendung initialisieren alle Anwendungsvariablen zur gleichen Zeit. Dies setzt voraus, dass die Anwendung beschäftigt genug ist, dies zu rechtfertigen. Die Gefahr ist nur da, wenn Ihre Anwendung zur Zeit damit beschäftigt ist Ihre Anwendung zum ersten Mal gestartet wird.

Die erste Sperre stellt sicher, dass nur eine Anforderung zu einem Zeitpunkt Ihre Variablen initialisiert.

Die zweite Sperre innerhalb der ersten eingebettet, prüft eine Variable, um sicherzustellen, am Ende Ihres Initialisierungscode definiert existiert, wie application.started. Wenn es vorhanden ist, wird der Benutzer gekickt.

Das Doppelverriegelungs Muster meiner Haut auf stark befahrenen Websites gespeichert, jedoch mit sehr beschäftigt Websites, die Warteschlange der Anforderungen für die anfänglichen Erfolg der Anwendung zu vervollständigen kann zu hoch klettern, zu schnell, und bewirkt, dass der Server zum Absturz bringen. Die Idee ist, werden die Anfragen nach dem ersten Treffer wartet, die langsam ist, dann der zweite bricht in die erste cflock und wird schnell verworfen. Mit Hunderten oder Tausenden von Anfragen in der Warteschlange, jede Millisekunde wachsen, werden schleusen sie alle zum ersten cflock Block nach unten. Die Lösung ist eine sehr niedrige Timeout auf dem ersten cflock zu setzen und nicht werfen (oder fängt und Ente) die Sperre Timeout-Fehler.

Als abschließende Bemerkung, dieses Verhalten, das ich beschrieben hat mit Coldfusion 7 des OnApplicationStart () -Methode Ihrer Application.cfc veraltet. Wenn Sie mit OnApplicationStart (), dann sollten Sie gar nicht für Ihre Anwendung init Routine werden zu verriegeln. Application.cfc ist gut bereits gesperrt.

Zum Schluss ja, doppelt geprüft Arbeiten in Coldfusion sperren. Es ist hilfreich, in einigen bestimmten Umständen, aber richtig. Ich weiß nicht, die Schaltpläne, warum es funktioniert im Gegensatz zu Java Threading-Modell, die Chancen sind es manuell ist in dem Hintergrund Ihres Coldfusion-Servers eine Art Lookup-Tabelle zu überprüfen.

Java ist THREAD, so dass es nicht so viel, dass Ihre Sperren werden nicht funktionieren, als dass sie nicht notwendig sind. Im Grunde genommen in CF 6+, werden Sperren benötigt für Rennbedingungen zu verhindern oder die Schaffung / althering Objekte, die außerhalb Javas Kontrolle existieren (Dateien, zum Beispiel).

Um eine ganz andere Dose Würmer zu öffnen ...

Warum Sie nicht über eine Dependency Injection-Bibliothek, wie Coldspring verwenden, den Überblick über Ihre Objekte zu halten und zirkuläre Abhängigkeiten zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top