Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Java-Desktop - Wie trennt man den Datenbankzugriff vom UI-Thread?

Es scheint, als würden Ihre DB-Abfragen vom UI-Thread ausgeführt, obwohl Sie sagen, dass eine geplante Aufgabe die Abfragen ausführt (?). Zur Sicherheit können Sie sich einen Stacktrace ausdrucken, wo Sie auf die Datenbank zugreifen:

new Exception().printStacktrace();

Über zu Ihrer vorgeschlagenen Lösung:Es scheint ein anständiges Design zu sein, wenn Ihre DB-Abfragen langsam sind und sonst Ihre Benutzeroberfläche einfrieren würden. Sie könnten ein Ereignissystem zwischen Ihrem UI-Layer und dem DB-Layer implementieren, vielleicht ein einfacher warteschlangenbasierter Ansatz.

BEARBEITEN:

Es gibt höchstwahrscheinlich Beispiele für die Implementierung einer ereignisbasierten Lösung.

Haftungsausschluss:Ich habe seit vielen Jahren keine echte UI-Programmierung mehr gemacht.

  1. Der Benutzer klickt auf eine Schaltfläche in der Benutzeroberfläche. Der UI-Thread stellt ein Ereignisobjekt (DataWantedEvent) in eine Warteschlange (java.util.Queue), ändert ein Label ("Warten auf Daten...") und fährt dann fort und wartet auf andere Benutzerinteraktionen.
  2. Der DB-Layer-Thread nimmt das Ereignis aus der Warteschlange und fragt die Datenbank ab. Das Ergebnis wird in einem Ergebnisobjekt an eine andere Warteschlange zurückgesendet.
  3. Ein UI-Thread (wahrscheinlich nicht der Hauptthread) nimmt das Ergebnisobjekt aus der Ergebniswarteschlange und aktualisiert die UI.

Eine Warteschlange zum Zurücksenden von Ergebnisobjekten an die Benutzeroberfläche ist möglicherweise nicht erforderlich. Eine Aktualisierungsmethode könnte direkt aufgerufen werden.

Wenn der Benutzer auf eine Abbrechen-Schaltfläche klickt, könnte das Aktualisierungsereignis/der Rückruf ignoriert werden, oder, falls möglich, könnte die DB-Abfrage abgebrochen werden.