Maison >Java >javaDidacticiel >Comment effectuer en toute sécurité des requêtes de base de données dans JavaFX sans bloquer le thread de l'interface utilisateur ?

Comment effectuer en toute sécurité des requêtes de base de données dans JavaFX sans bloquer le thread de l'interface utilisateur ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-31 00:13:40817parcourir

How to Safely Perform Database Requests in JavaFX Without Blocking the UI Thread?

Concurrence dans JavaFX : utilisation de threads pour les requêtes de base de données

Comprendre les règles de threading JavaFX

Dans JavaFX, deux règles clés régissent le threading :

  • Règle 1 : Opérations UI (modification ou accéder aux éléments du graphique de scène) doit être exécuté sur le thread d'application JavaFX.
  • Règle 2 : Les opérations de longue durée (par exemple, les requêtes de base de données) doivent être effectuées sur un thread d'arrière-plan.

Votre code et l'exception

Votre code révèle une exception car vous tentez de modifier le Étiquette courseCodeLbl (une opération d'interface utilisateur) à partir d'un fil d'arrière-plan (le nouveau Thread créé avec Runnable). Cela viole la règle 1.

Implémentation correcte à l'aide de threads

Pour résoudre ce problème, vous devez exécuter la requête de base de données dans un thread d'arrière-plan, puis mettre à jour l'interface utilisateur sur le thread d'application JavaFX. Ceci peut être réalisé en suivant les étapes suivantes :

  1. Créez un objet Task qui représente l'opération de la base de données.
  2. Initialisez la tâche avec les paramètres appropriés pour la base de données. appeler.
  3. Mettre en œuvre les Tâches call() pour effectuer la requête de base de données et renvoyer le résultat.
  4. Enregistrez un gestionnaire setOnSucceeded avec la tâche pour gérer la mise à jour de l'interface utilisateur une fois la tâche terminée.
  5. Exécutez la tâche sur un fil d'arrière-plan.

En utilisant le API javafx.concurrent

JavaFX fournit l'API javafx.concurrent pour gérer la concurrence et gérer les mises à jour de l'interface utilisateur à partir des threads en arrière-plan. Task est la classe fondamentale de cette API, et elle vous permet de :

  • Exécuter du code dans un thread d'arrière-plan et mettre à jour les propriétés de l'interface utilisateur sur le thread d'application.
  • Gérer l'achèvement des tâches à l'aide de rappels tels que setOnSucceeded et setOnFailed.

Exemple avec DAO et Task

En suivant le modèle de conception recommandé, l'accès à la base de données doit être encapsulé dans un Objet d'accès aux données (DAO) classe, qui ne connaît pas l'interface utilisateur. Ensuite, une tâche peut être utilisée pour invoquer les méthodes du DAO sur un thread d'arrière-plan.

Voici un exemple de DAO qui récupère les widgets par type :

public class WidgetDAO {
    public List<Widget> getWidgetsByType(String type) throws SQLException {
        // Database query to retrieve widgets
    }
}

Et une classe de contrôleur qui utilise Tâche et javafx.concurrent.Executor pour effectuer l'opération de base de données et mettre à jour le UI :

public class MyController {
    private WidgetDAO widgetAccessor;
    private Executor exec; // Executor to execute tasks on a thread pool

    public void searchWidgets() {
        final String searchString = widgetTypeSearchField.getText();
        Task<List<Widget>> widgetSearchTask = new Task<>() {
            @Override
            public List<Widget> call() throws Exception {
                return widgetAccessor.getWidgetsByType(searchString);
            }
        };

        widgetSearchTask.setOnSucceeded(e -> {
            widgetTable.getItems().setAll(widgetSearchTask.getValue());
        });

        exec.execute(widgetSearchTask);
    }
}

En encapsulant l'accès à la base de données et en tirant parti de l'API de concurrence de JavaFX, vous pouvez exécuter des requêtes de base de données sur des threads distincts tout en conservant la réactivité de l'interface utilisateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn