TOPIC: Refresh von BeanContainerDataSource
5 months 1 week ago #688
Hallo,

ich nutze eine XdevOptionGroup, die per Drag&Drop auf die Oberfläche gezogen wurde. Setzt man im Properties-Bereich die Entity, wird automatisch unter Data die Methode findAll ausgewählt. Auto query data bleibt standardmäßig aktiviert.
Ändere ich nun an anderer Stelle irgendwelche Daten und rufe anschließend optionGroup.getBeanContainerDataSource().refresh() auf, tut sich nichts. Erst wenn ich bei den Properties unter Data nichts auswähle, funktioniert alles.
Das ist solange nicht schlimm, solange immer alle Daten angezeigt werden sollen. Gefilterte Ansichten sind so aber nicht möglich. Deshalb glaube ich, dass es sich hier um einen Bug handelt.

Gruß
UWK
The administrator has disabled public write access.
4 months 3 weeks ago #709
Hallo Zusammen,

funktioniert der Refresh der BeanContainerDataSoruce im Allgemeinen denn?
Ich habe das Problem, dass die Methode in all meinen Projekten auch ohne Eintrag unter Data Nichts nachlädt.

Kann mir jemand bestätigen, ob die Methode für Tables derzeit funktioniert?

Danke und Gruß
Adriano
The administrator has disabled public write access.
4 months 2 weeks ago #731
Moin moin liebes RapidClipse Team,

das Thema ist nicht behoben, wenn es hier nicht eine konkrete Änderung gab, dann funktioniert etwas nicht.

Das Problem ist nicht nur der Refresh bei einem Table Update.
Wenn man einen Datensatz direkt physisch in der Datenbank löscht, dann scheint er im Container oder der Session oder sonst wo noch vorhanden zu sein.

Als Beispiel: Ich habe einen User über den Data Source Explorer aus der Datenbank gelöscht und anschließend über die MySQL Workbench üperprüft, ob er wirklich gelöscht wurde. Das war der Fall aber man kann sich mit den Userdaten noch einloggen obwohl der Datensatz weg ist. Ich habe das mehrfach getestet und es geht erst nach einem Redeploy der Anwendung. Jedes einzelene Mal.

Ich verstehe das Verhalten nicht und würde Euch deshalb bitten zu testen, ob Ihr das reproduzieren könnt.

Danke und Gruß
Adriano
The administrator has disabled public write access.
4 months 2 weeks ago #733
Hallo,

zu dem "refresh" - Thema:

Es gibt zwei Arten, wie die daten in eine Table oder Optiongroup geladen werden können:
1. mit der AutoQueryData - Funktionalität
2. mit "findAll" oder einer anderen DAO-Methode

Ersteres ist dynamisch, es wird nicht alles geladen. Der dahinter liegende Container weiß um die Datenbank und die Verbindung.
Dementsprechend funktioniert hier das "optionGroup.getBeanContainerDataSource().refresh()"

Bei Zweiterem wird alles geladen, der Container hat kein Wissen um und keine Verbindung zur Datenbank. Also muß der "Refresh" manuell gemacht werden, indem die Daten (komplett) neu geladen werden.

Und sobald bei "Data" etwas gesetzt ist, z.B. "findAll", wird intern von 1. auf 2. umgeschaltet.
Auch wenn die Eigenschaft "AutoQueryData" noch gesetzt ist!



Und noch zum Thema mit dem User:

Das liegt an dem second-level-cache, in unserem Fall der EHCache. Hier werden Ergebnisse von Datenbankqueries und Entities gecacht.
Wenn nun eine Änderung der Datenbank von "Außerhalb" stattfindet, bekommt der Cache das nicht mit, und ist somit auf einem "veraltetem" Stand.

In genannten Beispiel ist auch der RapidClipse DataSource Explorer ein "Außerhalb", weswegen der Cache der Applikation noch auf dem Stand ist, in dem der User noch existiert...

Es ist also nach Möglichkeit zu vermeiden, dass mehrere Applikationen Änderungen an derselben Datenbank durchführen.
Und wenn es nicht anders geht, gibt es mehrere Möglichkeiten: z.b. kann dem Entity die Annotation @Cacheable(false) hinzugefügt werden. Dann wird dieses Entitiy nicht gecacht, sondern immer direkt aus der DB geholt.

Wenn der User übrigens von derselben App gelöscht wird, bekommt das der Cache mit, und man kann sich nicht mehr mit diesem User einloggen.

RapidClipse Team
The administrator has disabled public write access.
4 months 2 weeks ago #738
Hallo liebes Rapidclipse-Team,

zunächst danke für die ausführliche Erklärung.
Dann werde ich den Ansatz mit @Cacheable(false) versuchen, da ich das Zusammenspiel von einer App mit QR-Code Scanner und einer WebApp benötige. Leider wird zwar der Status wenn gescannt wurde in der App aktualisiert aber nicht in der WebApp nachdem mit "getBeanContainerDataSource().refresh()" die Table upgedatet wurde.

Trotzdem wie immer danke für die schnelle Hilfe.

Gruß
Adriano
The administrator has disabled public write access.
3 months 1 week ago #823
Servus,

hört sich so an als wären die beiden Komponenten (WebApp / MobileApp) mit RapidClipse entwickelt. Falls ja, kann der Cache durchaus auch synchronisiert werden, das bedeutet jedoch ganz erheblichen Konfigurations-Aufwand. Ein Überblick der notwendigen Schritte wäre z.B. hier:

www.surekhatech.com/blog/hibernate-secon...-cluster-environment

Falls 2 getrennte Deployments für die 2 Komponenten notwendig sind, könnte deren Cache synchronisiert werden. Falls die Anwendung mal "größer" wird, ist sowieso clusterung pflicht .... und dann auch die Cache-Synchronisation.

Habe leider aktuell kein Sample-Projekt als Vorlage, bin grad bei der Einrichtung der Basics.


Gruß
Michael
The administrator has disabled public write access.