iBatis: Probleme mit dem Cache

NicoCollard

Grünschnabel
Hallo zusammen,

vielleicht kann mir hier jemand helfen.

Ich verwende in meiner Java-Client-Anwendung iBatis als Persistenz-Framework und bin auch bisher sehr zufrieden gewesen. Jetzt habe ich die Situation, dass ich mit mehreren Programm-Instanzen auf der Datenbank (H2 und zu Testzwecken auch die MySQL) arbeiten möchte. Der Ablauf soll (sehr vereinfacht gesprochen) der sein, dass die erste Instanz gewisse Aufgaben übernimmt und dies auch den anderen Instanzen mitteilt. Die zuständige Instanz schreibt also bspw. alle 30 Sekunden in eine entsprechende DB-Tabelle seinen Namen und zählt einen Counter hoch. Alle weiteren und neuen Instanzen sollen jetzt regelmäßig schauen, ob die zuständige Instanz noch da ist (Überprüfung über die DB - hat sich der Counter erhöht).

Hier kommt jetzt mein Problem: Obwohl ich für iBatis eingestellt habe, dass kein Cache verwendet werden soll, greifen die weiteren/neuen Instanzen immer auf das gleiche Objekt (auch gleiche ID) aus dem Cache zu, so dass sie nicht mitbekommen, dass der Counter sich erhöht und die zuständige Instanz noch lebt. Für Select-Anfragen scheint der Cache (auf oberster Ebene) immer aktiviert zu sein.

Wenn ich vor meinem select-Aufruf ein clearCache() oder commit() auf die SqlSession ausführe, dann funktioniert mein Programmablauf, wie gewünscht.

Hatte jemand ähnliche Schwierigkeiten mit iBatis?
Vielen Dank für Eure Hilfe...
Nico
 
Zuletzt bearbeitet:
So - ich habe noch einmal die Dokumentation von iBatis 3 gewälzt und das Internet befragt. Scheinbar mache ich etwas Grundlegendes falsch:
ich habe versucht eine SqlSession pro Thread zu halten.

Jetzt steht in der Doku aber eindeutig, dass SqlSession-Instanzen nicht gemeinsam genutzt werden sollen und "Never keep references to a SqlSession instance in a static field or even an instance field of a class." (Seite 9)

Dadurch ergibt sich jetzt für mich die Frage, ob jetzt wirklich für jedem INSERT-, UPDATE-, SELECT-Aufruf eine neue Session geöffnet werden soll, wie es das Bsp. (ebenfalls Seite 9) zeigt:

Code:
SqlSession session = sqlSessionFactory.openSession();
try {
     // do work
} finally {
     session.close();
}

Was ist, wenn ich über mehrere DAO-Klassen eine Transaktion laufen lassen will. Wird die aktuelle Session dann der Methode mit übergeben? Mir fehlen hier eindeutig Hinweise für die Best Practices. Wisst Ihr mehr?

Vielen Dank.
Nico
 
Zurück