11
votes

Comment puis-je détecter qu'une tadoconnection a perdu la communication avec le serveur?

Je dois détecter quand un Tadoconnection < / a> composant a perdu la connexion avec le serveur. J'ai essayé d'utiliser le Ondisconnect événement, mais cela ne tire que lorsque la méthode de fermeture est appelée ou que la propriété connectée est définie sur FALSE.

Une autre option que j'ai essayée utilise un Timer et exécute une requête comme celle-ci xxx

dans l'événement Ontimer, attraper toute exception qui se produit.

y a-t-il une meilleure option pour détecter que la connexion a été perdue?


1 commentaires

SQL Server permet QRY.EXECSQL avec SQL.Text = '' comme requête (mais pas ''). Cela peut être exécuté des centaines de fois par seconde.


4 Réponses :


11
votes

Je vois la double table. Signifie que vous utilisez l'oracle :)

Pour la plupart (tous?) CLIENT / SERVER SANS SANS Il n'y a aucun moyen de détecter, qu'une connexion est perdue, autre que de demander à un SGBD pour une action. Et il y a beaucoup de raisons, pourquoi une connexion est perdue. Peut-être une défaillance du réseau, peut être ..., peut être un DBA shopdowné un dB.

De nombreuses API de DBMS, y compris Oracle OCI, ont les fonctions spéciales, permettant de ping un SGBD. La "ping" est une requête la plus petite possible à un SGBD. La sélection ci-dessus nécessite beaucoup plus de travail que de tels ping.

Cependant, tous les composants d'accès aux données, y compris ADO, permettent de ping un SGBD, à l'aide de l'appel de la DBMS API Ping. Ensuite, vous devez utiliser une commande SQL. Donc, la sélection ci-dessus est correcte avec ADO. Autre option - commence null; FINIR;. Il peut utiliser moins de ressources DBMS (pas besoin d'optimiseur, pas besoin de décrire un ensemble de résultats, etc.).

Timer est ok. La requête doit être effectuée dans un fil, où la connexion correspondante est utilisée. Pas indispensable, mais c'est un problème différent.

Le problème potentiel peut être de fermer une connexion lorsque une connexion est perdue. La fermeture d'une connexion peut augmenter une exception en raison de l'API DBMS peut être dans un état défaillant.

genre de ça ...


1 commentaires

Salut da-doux. Si nous utilisons Tadoconnection dans le fil principal, nous devons "ping" le SQL du fil principal? Devons-nous également utiliser la même tadoconnection ou utiliser une autre tadoconnection "ping" différente?



4
votes

La réponse @Dimitry est très bonne. S'il est essentiel à votre application de savoir si la Connecto est perdue, l'approche Timer (avec une opportunité minimale).

Si vous voulez simplement savoir quand une instruction échoue en raison d'une "communication perdue", vous pouvez utiliser l'événement Application.Exception et inspecter les propriétés d'exception.

J'ai fait le code suivant, en utilisant le composant applicatifsvents. Est juste un brouillon avec l'idée, qui ne convient pas à la production. xxx

meilleures salutations.


0 commentaires

-1
votes

C'est l'une des raisons de supprimer ADO et d'utiliser DBX. ADO Architecture est un curseur de serveur basé sur le curseur et cette requéreur ne doit pas perdre la connexion au serveur à tout moment. Si la connexion est perdue dans certaines circonstances, la connexion sera incapable de se lever à nouveau. Dans l'autre main, DBX est capable de se reconnecter à jamais à cause de son arquitecture déconnectée.


2 commentaires

Ce n'est pas vrai. ADO peut utiliser comme serveur que les curseurs clients et permet d'appliquer un modèle de jeu de données déconnecté. De About.com: Afin de créer un enregistrement ADO déconnecté, vous devez d'abord définir la propriété ADODaTaseSets Cursorlocation sur "Cluseclient". Puis ouvrez le jeu d'enregistrement. Ensuite, réglez la connexion AdodaTasets à NIL. Ne fermez pas l'adodataset.


Oui ADO peut travailler en mode mallette. Mais la réponse de DBX sur cette question est plus naturelle et prévisible.



0
votes

J'ai le même problème sur la piscine de connexion. J'ai développé une classe TadosqLConnectionPool pour vous aider à réutiliser la connexion pour les travaux de DB Threads. Lorsque je souhaite attribuer une connexion à un thread, j'ai essayé de vérifier la santé en exécutant le travail minimum comme "Select 1". De cette façon, je serai sûr de la connexion.Si-il échoue, je vais disposer de toutes les connexions à recréer à la demande suivante.


0 commentaires