2016-04-22 23 views
3

Ich habe ein Problem bei dem Versuch, Write-Behind auf Caches zu verwenden, die mit Tabellen verbunden sind, die Fremdschlüsseleinschränkungen zwischen ihnen haben. Scheinbar führt der Write-Behind-Mechanismus die Aktualisierungen/Einfügungen nicht in einer deterministischen Reihenfolge aus, sondern versucht stattdessen, alle gesammelten Änderungen für jeden Cache nacheinander in einer unbekannten Reihenfolge zu übertragen. Aber da wir Fremdschlüssel in den Tabellen haben, ist die Reihenfolge der Operationen von Bedeutung, so dass Elternobjekte zuerst eingefügt/aktualisiert werden sollten und Kinder erst danach (andernfalls werden Fremdschlüsselverletzungen aus der DB geworfen).Verwenden von Write-Behind mit Fremdschlüsseln in Apache Ignite

Es scheint, dass die aktuelle Implementierung versucht, dieses Problem auf einem Trial-and-Error-Basis Umgehung (org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore:888), was bedeutet, dass sie in regelmäßigen Abständen die Änderungen immer wieder für die Caches bei dem eine Spülung wiederholen zu Constraint-Verletzung aufgetreten. Daher versucht der "untergeordnete" Cache regelmäßig zu spülen, bis der "übergeordnete" Cache zuerst geleert wird. Dies führt letztendlich dazu, dass die Daten in die DB gelangen, aber es bedeutet auch eine Menge fehlgeschlagener Versuche im Falle komplexer hierarchischer Tabellen, bis die richtige Reihenfolge "gefunden" ist. Dies führt zu einer schlechten Leistung und einem unnötigen Beschuss der DB.

Haben Sie Vorschläge, wie ich dieses Problem umgehen könnte?

(Anfang versuche ich mit Write-Through, aber es führte zu sehr schlechte Leistung, weil die CacheAbstractJdbcStore scheinbar eine neue vorbereitete Anweisung für jede insert/update Betrieb zu öffnen.)

Antwort

2

Mit Schreib hinter der Reihenfolge von Speicheraktualisierungen ist nicht definiert, da jeder Knoten unabhängig und asynchron schreibt. Wenn Sie Fremdschlüsseleinschränkungen haben, sollten Sie Write-Through verwenden.

Wie für die Write-through-Leistung, CacheAbstractJdbcStore arbeitet mit einem konfigurierbaren DataSource, so hängt es von seiner Implementierung ab, ob es jedes Mal eine neue Verbindung öffnet oder nicht. Wenn Sie eine gepoolte Version verwenden, wird dies nicht passieren.

Verwandte Themen