Récupération d'une connexion (FireDAC)

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Utilisation des connexions (FireDAC)


Décrit comment travailler dans un environnement instable. FireDAC permet à une application de récupérer une connexion après un échec.

Informations générales

Une application de base de données peut fonctionner dans un environnement instable dans lequel le réseau peut être physiquement déconnecté ou le serveur SGBD peut être redémarré. L'application doit récupérer de façon transparente après ces interruptions et continuer à communiquer avec le SGBD.

La récupération de connexion automatique de FireDAC vous permet de détecter une connexion perdue, de répondre en conséquence et de récupérer la connexion. La perte ne peut être découverte que lorsqu'une certaine action est réalisée dans la base de données, par exemple : Open, ExecSQL ou Ping. Le pilote SGBD déclenche alors une EFDDBEngineException avec Kind = ekServerGone.

Le moyen le plus simple de vérifier le statut d'une connexion et/ou de conserver la connexion consiste à appeler la méthode TFDCustomConnection.Ping. La méthode Ping peut être utilisée même quand une connexion est fermée, afin de savoir quand une connexion peut être établie.

Limites connues :

SGBD Description
Advantage Database Non supporté pour une connexion libre locale.
Pilote de pont dbExpress
  • FireDAC peut ne pas détecter ekServerGone.
  • La méthode Ping n'est pas supportée.
Informix Requis pour définir DirectExecute sur True.
Microsoft Access Non géré.
MySQL Pour réduire les retards d'appels quand la connexion réseau est perdue, pensez à modifier les paramètres de définition de connexion ReadTimeout et WriteTimeout.
Pilote de pont ODBC
  • FireDAC peut ne pas détecter ekServerGone.
  • La méthode Ping n'est pas supportée.
SQLite Non géré.

Contrôle de la récupération de connexion

Pour activer la récupération de connexion automatique, définissez ResourceOptions.AutoReconnect sur True. Vous pouvez également utiliser les gestionnaires d'événement TFDCustomConnection :

  • OnRecover -- pour répondre à l'événement de connexion perdue et fournir l'action suivante à FireDAC.
  • OnLosted -- se déclenche quand une connexion a été perdue et n'a pas été récupérée.
  • OnRestored -- se déclenche quand une connexion a été perdue et récupérée.

La réponse du gestionnaire d'événement TFDCustomConnection.OnRecover peut être de rétablir la connexion, de passer en mode hors ligne ou simplement de fermer la connexion. Quand OnRecover n'est pas spécifié, FireDAC tente de rétablir la connexion. Par exemple :

 procedure TForm1.FDConnection1Recover(ASender: TObject;
   const AInitiator: IFDStanObject; AException: Exception;
   var AAction: TFDPhysConnectionRecoverAction);
 var
   iRes: Integer;
 begin
   iRes := MessageDlg('Connection is lost. Offline - yes, Retry - ok, Fail - Cancel',
     mtConfirmation, [mbYes, mbOK, mbCancel], 0);
   case iRes of
   mrYes:    AAction := faOfflineAbort;
   mrOk:     AAction := faRetry;
   mrCancel: AAction := faFail;
   end;
   Log('Connection is recovering');
 end;

Nous vous recommandons vivement de ne pas fermer le gestionnaire FireDAC à partir des gestionnaires d'événement OnRecover, OnLost et OnRestored, car cela peut générer des problèmes imprévus.

Préparation de l’application

Quand une connexion est récupérée, les états suivants sont perdus :

  • les transactions actives sont annulées et l'exécution se poursuit à partir de l'instruction échouée.
  • les ensembles de résultats qui n'ont pas encore été extraits sont tronqués et TFDDataSet.SourceEOF est défini sur True.
  • les états des sessions de base de données sont perdus, notamment l'état des packages Oracle et les variables de session.
  • les alertes de base de données enregistrées ne sont plus enregistrées.

Pour préparer votre application à fonctionner dans un environnement instable et réduire l'impact des échecs, définissez les valeurs d'options suivantes :

Définir cette option Sur la valeur suivante

FetchOptions.Mode

fmAll

FetchOptions.RowsetSize

200 - 300

FetchOptions.AutoClose

True (par défaut)

TxOptions.AutoCommit

True

ResourceOptions.AutoReconnect

True

L'application peut utiliser le mode de connexion hors ligne et CachedUpdates.

Voir aussi