Récupération d'une connexion (FireDAC)
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.
Sommaire
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 |
|
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 |
|
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 | |
---|---|---|
fmAll |
||
200 - 300 |
||
True (par défaut) | ||
True |
||
True |
L'application peut utiliser le mode de connexion hors ligne et CachedUpdates.