Gestion de sessions multiples

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gestion des sessions de bases de données - Index

Remarque : Le moteur de base de données Borland (BDE, Borland Database Engine) a été déprécié. Il ne sera donc pas amélioré. Par exemple, le BDE ne prendra jamais en charge Unicode. Vous ne devriez pas entreprendre de nouveaux développements avec BDE. Prévoyez plutôt de migrer vos applications de bases de données existantes de BDE vers dbExpress.

Si vous créez une application unique utilisant plusieurs threads pour effectuer des opérations de bases de données, vous devez créer une session supplémentaire pour chaque thread. La catégorie BDE de la palette d'outils contient un composant session que vous pouvez placer dans un module de données ou une fiche au moment de la conception.

Avertissement :  Quand vous placez un composant session, vous devez aussi définir sa propriété SessionName à une valeur unique afin d'éviter les conflits avec la propriété SessionName de la session par défaut.

Placer un composant session au moment de la conception présuppose que le nombre de threads (et donc de sessions) requis par l'application à l'exécution est statique. Cependant, il est plus probable qu'une application doive créer des sessions dynamiquement. Pour cela, appelez la méthode OpenSession de l'objet global Bde.DBTables.Sessions à l'exécution.

OpenSession ne demande qu'un seul paramètre, un nom de session qui doit être unique parmi tous les noms de sessions de l'application. Le code suivant crée dynamiquement et active une nouvelle session avec un nom généré unique :

Sessions.OpenSession('RunTimeSession' + IntToStr(Sessions.Count + 1));
Sessions->OpenSession("RunTimeSession" + IntToStr(Sessions->Count + 1));

Cette instruction génère un nom unique pour une nouvelle session en récupérant le nombre de sessions en cours et en l'augmentant de 1. Notez que si vous créez et détruisez dynamiquement des sessions à l'exécution, ce code exemple ne fonctionnera comme prévu. Néanmoins, il montre comment utiliser les propriétés et les méthodes de Sessions pour gérer les sessions multiples.

Sessions est une variable de type TSessionList qui est automatiquement instanciée pour les applications de bases de données BDE. Vous pouvez utiliser les propriétés et les méthodes de Sessions pour tracer les sessions multiples d'une application de base de données multithread. Le tableau suivant résume les propriétés et les méthodes du composant TSessionList :

Propriétés et méthodes de TSessionList :

Propriété ou méthode Utilisation

Count

Renvoie le nombre de sessions, actives et inactives, dans la liste des sessions.

FindSession

Recherche une session d'un nom spécifié et renvoie un pointeur dessus, ou nil s'il n'y en a pas. Si on lui passe un nom de session vide, FindSession renvoie un pointeur sur la session par défaut, Session.

GetSessionNames

Remplit une liste de chaînes avec les noms de tous les composants session couramment instanciés. Cette procédure ajoute toujours au moins une chaîne, “Default” pour la session par défaut.

List

Renvoie le composant session pour le nom de session spécifié. S'il n'y a pas de session avec ce nom, une exception est déclenchée.

OpenSession

Crée et active une nouvelle session et réactive une session existante pour le nom de session spécifié.

Sessions

Accède à la liste des sessions par valeur ordinale.

En exemple à l'utilisation des propriétés et des méthodes de Sessions dans une application multithread, considérez ce qui se passe quand vous voulez ouvrir une connexion de base de données. Pour déterminer si une connexion existe déjà, utilisez la propriété Sessions pour parcourir chaque session de la liste de sessions, en commençant par la session par défaut. Examinez la propriété Databases de chaque composant session pour voir si la base de données en question est ouverte. Si vous découvrez qu'un autre thread utilise déjà la base de données désirée, examinez la session suivante de la liste.

Si aucun thread existant n'utilise la base de données, vous pouvez ouvrir la connexion avec cette session.

En revanche, si tous les threads existants utilisent la base de données, vous devez ouvrir une nouvelle session dans laquelle vous ouvrirez une autre connexion de base de données.

Si vous répliquez un module de données contenant une session dans une application multithread, où chaque thread contient sa propre copie du module de données, vous pouvez utiliser la propriété AutoSessionName pour vous assurer que tous les ensembles de données de ce module de données utilisent la session adéquate. Définir AutoSessionName à True permet à la session de générer dynamiquement son propre nom unique quand elle est créée à l'exécution. Elle affecte ensuite ce nom à chaque ensemble de données du module de données, redéfinissant tout nom de session explicitement défini. Cela assure que chaque thread possède sa propre session, et que chaque ensemble de données utilise la session dans son propre module de données.

Voir aussi