Gemeinsame Nutzung einer Java synchronisierten Block über einen Cluster oder eine globale Sperre mit?

StackOverflow https://stackoverflow.com/questions/1228833

Frage

Ich habe einige Code, ich möchte nur von einem Thread den Zugriff ermöglichen. Ich weiß, wie diese entweder synchronized Blöcke oder Methoden verwendet zu erreichen, aber wird diese Arbeit in einer Cluster-Umgebung?

Die Zielumgebung ist WebSphere 6.0, mit zwei Knoten im Cluster.

Ich habe das Gefühl, das wird nicht funktionieren synchronized, da jede Instanz der Anwendung auf jedem Knoten seine eigene JVM hat, nicht wahr?

Was ich versuche, hier zu tun ist, einige Updates zu Datenbankaufzeichnungen durchführen, wenn das System gebootet wird. Es wird für alle Datenbankeinträge suchen, die, dass die Version des Codes älter sind, und bestimmte Aufgaben ausführen, um sie zu aktualisieren. Ich möchte nur einen Knoten diese Upgrades durchzuführen, da ich sicher sein will, dass jedes Arbeitselement nur einmal aktualisiert wird, und die Leistung dieses Upgrades ist kein großes Problem, da es nur beim Start der Anwendung geschieht, und es nur wirklich etwas tut wenn der Code hat es begonnen, seit dem letzten Mal geändert wurde.

Die Datenbank ist DB2v9, und ich es direkt über JNDI (keine ORM-Schicht) am Zugriff.

Es wurde vorgeschlagen, dass eine globale Sperre könnte der Weg sein, hier zu gehen, aber ich bin nicht sicher, wie das zu tun.

Hat jemand irgendwelche Hinweise in diesem Bereich?

Danke!

War es hilfreich?

Lösung

Sie sind richtig, dass die Synchronisation über Prozesse die Java-Synchronisationskonstrukten nicht funktionieren werden. Glücklicherweise wirklich Ihr Problem ist nicht die Code-Synchronisation, sondern von Interaktionen mit der Datenbank synchronisiert werden.

Der richtige Weg, um mit diesem Problem umzugehen ist, mit Datenbanksperren. Vermutlich haben Sie einige Tabelle, die eine Db-Schema-Version enthält, so sollten Sie sicherstellen, dass für die Dauer der Inbetriebnahme, dass die Tabelle sperren / Upgrade-Prozess.

Die genaue SQL / db beteiligten Anrufe wahrscheinlich klar sein würden, wenn Sie Ihren Datenbanktyp (DB2?) Angegeben und Zugriffsmethode (raw SQL, JPA, etc).

Update (2009.08.04 02.39) : Ich schlage vor, die Anweisung LOCK TABLE auf einige Tabelle, die die Version # des Schemas zu halten. Dies wird serialisiert Zugriff auf diese Tabelle zu verhindern zwei Instanzen laufen durch den Upgrade-Code auf einmal.

Andere Tipps

Ja, Sie sind richtig, dass synchronisiert Blöcke werden nicht über einen Cluster arbeiten. Der Grund dafür ist, wie Sie sagen, dass jeder Knoten eine eigene JVM hat.

Es gibt Möglichkeiten, aber zu synchronisierenden Blöcke in einem Cluster zu arbeiten, wie sie in einer Single-Node-Umgebung funktionieren würden. Der einfachste Weg ist es, ein Produkt wie Terracotta zu verwenden, die die Koordination der Threads zwischen verschiedenen JVMs behandelt, so dass normale Kontrollen concurrency kann über den Cluster verwendet werden. Es gibt viele Artikel erklären, wie das funktioniert, wie Einführung in OpenTerracotta .

Es gibt andere Lösungen, natürlich. Es hängt vor allem davon ab, was Sie wirklich hier erreichen wollen. Ich würde nicht Datenbank-Sperren für die Synchronisierung verwenden, wenn Sie skalieren müssen, wie DB nicht. Aber ich fordere Sie wirklich eine fertige Lösung zu finden, weil Herumspielen mit Cluster-Synchronisierung unordentlich Geschäft ist:)

Sie können mit einer In-Memory-Datenraster wie http://www.hazelcast.com/ für diese auch. Dies ist eine Datenstruktur, die verteilte Verriegelungs unterstützt.

Da Sie sprechen von zwei Maschinen, Sie haben Speicher nicht einmal geteilt, so gibt es nichts zu synchronisieren.

Wir tun etwas ähnliches mit unserer Datenbank. Dies wird durch Hinzufügen Rekord Versionierung in der Tabelle erreicht. Dies ist, was Sie tun sollten,

  1. Fügen Sie eine Spalte für die Aufzeichnung / Zeilenversion.
  2. durch die Logik gehen zu überprüfen, ob Datensatz aktualisiert werden muss.
  3. Wenn Sie Datensatz aktualisieren, stellen Sie sicher, dass der Rekord-Version in DB das gleiche wie das, was Sie haben.
  4. Bump up-Version jedes Mal, wenn Sie in die Datenbank schreiben.

Sie sollten nur ein Server die Aktualisierung der Datenbank, wenn Sie diese Regeln befolgen.

Könnten Sie nicht einfach sperren die Tabelle (oder ganze db) für Updates, so dass, wenn der erste Knoten in erhielt die Sperre aller andere Knoten nicht in der Lage sein, zu schreiben. Nachfolgende Knoten würde warten, und wenn die Sperre der Code freigegeben wird, würde so kein Rekord Update aktualisiert werden erforderlich wäre.

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