2016-04-01 11 views
1

Könnten Sie mir bitte mit folgenden Fragen helfen:Ignite Client-Knoten stellt keine Daten obwohl Serverknoten zu DB (mit Durchschreiben nur auf dem Server, ohne writeBehind)

Ich habe die folgende Konfiguration von partitionierten Cache-Cluster:

  • Serverknoten mit aktiviertem writeThrough. Sie sind in der Lage Daten von cacheStoreFactory=HibernateCacheStoreFactory

  • Client-Knoten ohne Durchschreiben Konfiguration DB zu schreiben, aber mit clientMode=true

I perform auf Client-Knoten setzen, dann sehe ich, dass diese Daten an den Serverknoten gesendet wird, Der Serverknoten führt jedoch put nur zum Zwischenspeichern aus, ruft aber cacheStoreFactory nicht auf (writeThrough-Verhalten). Daten werden also nur im Cluster zwischengespeichert, aber nicht in die DB geschrieben.

Wenn ich die writeThrough-Konfiguration den Client-Knoten hinzufüge, wird writeThrough natürlich aufgerufen, aber ich möchte Abhängigkeiten von Hibernate von den Client-Knoten entfernen.

Wenn ich die writeBehind-Konfiguration auf der Serverseite aktiviert, wird writeThrough-Funktionalität aufgerufen, und der Serverknoten schreibt Daten vom Clientknoten asynchron in die Datenbank. Aber es erfüllt meine Anforderungen nicht, weil ich Puts vom Client-Knoten in einer Transaktion ausführen möchte.

Ist es möglich, Puts vom Clientknoten zum Speichern von Daten nach Serverknoten mit writeThrough in der Transaktion ohne writeBehind auszuführen?

+0

Können Sie bitte für Ihre Konfiguration gemeinsam nutzen beide Server und Clients? Wenn Sie junit oder 'main()' programmieren können, um es lokal zu reproduzieren, wäre das perfekt. – Yakov

+0

Hallo, Yakov. Bitte tak einen Blick auf einfaches Beispiel: http://www.files.com/shared/5703709862af6/igniteclientserver.zip Zum Test: 0) Start Application 1) Starten ApplicationClient 2) Überprüfen Sie Änderungen im Verhalten von [ un] Kommentierung der Zeilen in 'config-server.xml': ' ' – TheMrTarget

Antwort

3

Der Transaktionscache schreibt in den Persistenzspeicher von dem Knoten, der die Transaktion initiiert hat (in Ihrem Fall handelt es sich um einen Clientknoten). Dies geschieht, weil eine Transaktion möglicherweise Einträge enthalten kann, die auf verschiedenen Knoten gespeichert sind, und wenn der Speicher auch von verschiedenen Knoten aktualisiert wird, wäre es unmöglich, die Transaktionskonsistenz zwischen dem Cache und der Datenbank aufrechtzuerhalten.

Wenn Sie nicht auf dem Client-Zugriff auf die Datenbank haben, können Sie einen Verschluss zu einem der Server senden und eine Transaktion dort beginnen, wie folgt aus:

Ignition.ignite().compute().run(new IgniteRunnable() { 
    @IgniteInstanceResource 
    private Ignite ignite; 

    @Override public void run() { 
     try (Transaction tx = ignite.transactions().txStart()) { 
      // Cache operations go here... 

      tx.commit(); 
     } 
    } 
}); 
+0

Hallo, Valentin. Ich vermutete das gleiche Verhalten, indem ich in den Quellcode von Ignite schaute, aber ich würde gerne überprüfen, dass es sich um eine architektonische Entscheidung handelt und nicht um einen Fehler. Vielen Dank für die Antwort. – TheMrTarget

+0

@Valentin - Ich habe eine Frage hier, da wir den gleichen Anwendungsfall haben. Ich habe nicht verfolgt, warum die Datenbank nicht aktualisiert wird, wenn die cacheConfiguration NICHT für das Durchschreiben auf dem Client-Knoten eingerichtet ist. Ist die Einstellung für den Schreibvorgang nicht durch einen Teil der Cache-Konfiguration anstelle des Client/Server-Knotens festgelegt? –

+0

@AndyDufresne Cache-Konfiguration ist auf allen Knoten identisch. Sie können nicht auf dem Server Write-Through aktiviert und auf dem Client deaktiviert haben. –