Zdá se, že vaše dotazy db jsou spouštěny z vlákna uživatelského rozhraní, i když říkáte, že naplánovaná úloha spouští dotazy (?). Pro jistotu si můžete vytisknout stacktrace, kde přistupujete k databázi:
new Exception().printStacktrace();
K vašemu navrhovanému řešení:vypadá to jako slušný design, pokud jsou vaše dotazy db pomalé a jinak by zmrazily vaše uživatelské rozhraní. Mezi vrstvou uživatelského rozhraní a vrstvou db byste mohli implementovat systém událostí, možná jednoduchý přístup založený na frontě.
UPRAVIT:
Nejpravděpodobnější jsou příklady, jak implementovat řešení založené na událostech.
Zřeknutí se odpovědnosti:Mnoho let jsem neprováděl žádné skutečné programování uživatelského rozhraní.
- Uživatel klikne na tlačítko v uživatelském rozhraní. Vlákno uživatelského rozhraní vloží objekt události (DataWantedEvent) do fronty (java.util.Queue), změní štítek ("Čekání na data...") a poté pokračuje a čeká na další interakce uživatele.
- Vlákno vrstvy db vezme událost z fronty a dotazuje se databáze. Výsledek je odeslán zpět do jiné fronty ve výsledném objektu.
- Vlákno uživatelského rozhraní (pravděpodobně ne hlavní vlákno) vezme výsledný objekt z fronty výsledků a aktualizuje uživatelské rozhraní.
Fronta pro odesílání výsledných objektů zpět do uživatelského rozhraní nemusí být potřeba. Metodu aktualizace lze vyvolat přímo.
Pokud uživatel klikne na tlačítko Storno, událost aktualizace/zpětné volání může být ignorována nebo, pokud je to možné, může být zrušen dotaz db.