# Hibernate-Problem mit MySQL-Cluster



## anja2006 (7. Dez 2006)

Hallo zusammen,

wir haben eine Webanwendung mit Hibernate und MySQL5.

Diese Anwendung haben wir jetzt auf einen Server mit MySQL-Cluster
umgezogen. Den Server gibt es auch zweimal.
Nun gibt es Probleme mit den IDs, da Hibernate sich diese wohl merkt und
nicht vor dem Schreiben mit der Datenbank abgleicht.

Gibt es eine Möglichkeit Hibernate dazu zu bringen, die IDs mit der
Datenbank abzugleichen, bevor es versucht in die Datenbank zu schreiben? 


Grüße
Anja :?:


----------



## Gast (7. Dez 2006)

Hae?
Ihr habt zwei MySQL-Server in nem Cluster. Somit müssten die Server aber identisch sein und damit dürfte es Hibernate auch net stören.
Und, sprichst du vno Primärschlüssenl oder was genau meinst du mit IDs?


----------



## anja2006 (8. Dez 2006)

Hallo,


also, wir haben 2 Webserver (Apache, Tomcat) und dahinter 2 MySQL-Server.

Die Datenbestände auf den beiden MySQL-Server sind natürlich identisch.

Wenn aber auf Webserver 1 über Hibernate ein Datensatz geschrieben wird, so bekommt das Webserver 2 nicht mit. Wenn dieser einen Datensatz schreibt holt er sich den Primärschlüssel nicht aus der Datenbank, sondern berechnet ihn auf der Grundlage seines zuletzt gespeicherten Schlüssels. Da aber Webserver 2 diesen Schlüssel bereits verbraucht hat, kracht es.

Jetzt würde ich Hibernate gerne dazu bringen erst in die Datenbank zu schauen und sich den zuletzt vergebenen Schlüssel zu holen, bevor es schreibt. --> Geht das?


Grüße
Anja


----------



## Gast (10. Dez 2006)

Vermute ich richtig das du versuchst auf beiden Datenbankservern Schreiboperationen auszuführen. Soviel ich weiß ist ein MySql Cluster nach einem Master and Slave Prinzip aufgebaut bei dem eigentlich nur Schreiboperationen auf dem Master erlaubt sind.
Soweit ich mich richtig erinnere ist es zwar möglich diese auch für einen Multimaster Prinzip zukonfigurieren aber, dies erfordert sehr viel Handarbeit. Das Problem dabei ist genau das was du beschrieben hast die Schlüsselgenerierung. 
Desweiter wird im Manual davon eigentlich auch abgeraten. Es gibt dann aber noch eine Komerzielleversion von MySql bei der es funktionieren sollte.


----------



## Gast (11. Dez 2006)

Die einfachste Möglichkeit dürfte wohl ein eigener Schlüsselgenerator sein. Ne eigene Tabelle welche nur 1 Datensatz mit dem aktuellen Schlüssel enthält. Läuft dann so ab

Tabelle Schluessel(int aktuell)

Anfrage auf 1 -> Hibernate sperrt Tabelle Schluessel, liest den Wert aus, erhöht den Wert, gibt die Tabelle wieder frei -> der geholte/generierte Schlüssel ist der Primärschlüssel für den Datensatz

Du könntest das ganze auch über ne StoredProc lösen. Ist imho die einzige praktikable Lösung. Oder eben der riesige Konfigurationsaufwand mit nem Multimaster-Cluster.

Aber mal Grundsätzlich:
Das Prinzip das ihr verfolgt ist imho nicht wirklich schlüssig. Cluster werden eigentlich im Master-Slave-Prinzip geschalten. 
Server 1 ist Master, Server 2 ist Slave. Fällt Server 1 aus springt Server 2 ein ohne dass der "Kunde" etwas davon merkt -> Hochverfügbarkeitscluster, FailOvercluster.

Welches Ziel verfolgt ihr mit eurem Ansatz denn?

Gruß Sebastian


----------



## anja2006 (14. Dez 2006)

Hallo,

wir haben die Tabellen auf autoincrement umgestellt und die erste ID auf 1.
Jetzt funktionierts!


----------



## KSG9|sebastian (18. Dez 2006)

ok, aber was passiert wenn die daten synchronisiert werden? werden dann auch die schlüssel neu geschrieben?
irgendwie werd ich aus eurem system nicht schlau.

Wenn das Ziel Ausfallsicherheit lautet dann wäre wohl folgendes das Ziel

Daten aus DB1 = Daten aus DB2

Mit eurer Lösung sieht das dann so aus:

Daten DB1 (PKey, Value)
1 - a
2 - b
3 - c
4 - d
...
Daten DB2(PKey, Value)
1 - w
2 - x
3 - y
4 - z

Wenn die Daten dann synchronisiert werden gibs nen ziemlichen Knall, weil entweder Daten überschrieben werden, Daten verloren gehen oder PKey doppelt vorhanden sind.


----------

