PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Surveiller une connexion Mysql
Surveiller une connexion Mysql
Débuté par obtuli, 16 juil. 2018 10:27 - 4 réponses
Membre enregistré
948 messages
Popularité : +11 (13 votes)
Posté le 16 juillet 2018 - 10:27
Bonjour,

Mon application fonctionne avec MySQL, quand l'utilisateur n'utilise pas le logiciel un certain temps, le serveur MySQL le déconnecte. Je n'ai pas la main sur ce serveur ni sur sa configuration.

Comment est-il possible de savoir si la connexion est active ou pas ? comment détecter le problème automatiquement sans tester avant chaque appel à la base.

Avec HFQSL, un message apparaît pour dire que la connexion est perdu et tente de se reconnecter automatiquement.
Avez vous une idée ?

merci !

OB

ps : j'ai pensé à faire un accès à la base régulièrement via un thread pour garder la connexion.
mais détecter une coupure m’intéresse surtout si coupure internet.
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 17 juillet 2018 - 03:47
Coucou,

WLANGAGE : DESIGN PATTERN RETRY & CIRCUIT BREAKER


https://www.pcsoft.fr/lst/Last/lst108.htm

--
In üs we trust - #92i
Message modifié, 17 juillet 2018 - 03:47
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 05 août 2018 - 19:49
Coucou,

Je te propose en // une bonne source d'inspiration ^^

////////////////////////////////////////////////////////////////////////////////////////////////
//                                             Retry pattern
////////////////////////////////////////////////////////////////////////////////////////////////
An application that communicates with elements running in the cloud has to be sensitive 
to the transient faults that can occur in this environment. 
Faults include the momentary loss of network connectivity to components and 
services, the temporary unavailability of a service,or timeouts that occur when a
service is busy.
These faults are typically self-correcting, and if the action that triggered a fault is 
repeated after a suitable delay it's likely to be successful. 
For example, a database service that's processing a large number of concurrent 
requests can implement a throttling strategy that temporarily rejects any further 
requests until its workload has eased.
An application trying to access the database might fail to connect, but if it tries again 
after a delay it might succeed.

Reference: https://docs.microsoft.com/en-us/azure/architecture/patterns/retry
////////////////////////////////////////////////////////////////////////////////////////////////

// Delay mode
EDelayMode est une Enumération
Unknown = -1
// Delay constant at each iteraction
Default = 1
// Delay incremented at each iteraction
Incremented = 2
// Delay double at each iteraction
Doubled = 3
FIN

APattern_Retry est une Classe, abstraite
GLOBAL
PUBLIC
CONSTANT
// Delay
__FORMAT_DELAY = "MM:SS:LLL"
END
LOCAL
PRIVÉE
// Delay mode
m_eDelayMode est un EDelayMode
// Procedure
// Before
m_xTProcedureBefore est une Procedure
// Running
m_xTProcedure est une Procedure
// After
m_xTProcedureAfter est une Procedure
// Retry counter
m_nRetryCount est un entier sans signe sur 4 octets
// Handle the intervals of times
// Default Intervals
m_xDelay est une Durée
// Default Increment
m_xDelayIncrement est une Durée
// CKSTs
m_taCKSTs est un tableau associatif (*, Null) de chaînes
FIN

Procedure PROTÉGÉE Initialization() <sans pas à pas>: boolean
// Gestion des erreurs
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)
// Valeur automatique renvoyer à la fin de la procedure
RETOUR = Faux
// Default Value
// Retry counter
:RetryCount = 1
// Waiting mode
:DelayMode = EDelayMode.Default
// Intervals of times
:Delay = 1s
:DelayIncrement = 0s
// Summary
RENVOYER Vrai
// Error management
CAS ERREUR:
ErreurPropage()
CAS EXCEPTION:
ExceptionPropage()

Procedure PROTÉGÉE CKST() <sans pas à pas>: boolean
// Gestion des erreurs
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)
// Valeur automatique renvoyer à la fin de la procedure
RETOUR = Faux
// Name
_sCKST est une chaîne
// Delay
// Intervals
_sCKST = "Delay"
SI :Delay < 0
:CKSTs[_sCKST] = _(__ERROR_SERVER_UNKNOWN_VALUE, ":Delay = '[% :Delay %]'")
FIN
// Mode
_sCKST = "DelayMode"
SI :DelayMode = EDelayMode.Unknown
:CKSTs[_sCKST] = _(__ERROR_SERVER_UNKNOWN_VALUE, ":DelayMode = '[% :DelayMode..Nom %]'")
FIN
// RetryCount
_sCKST = "RetryCount"
SI :RetryCount < 1
:CKSTs[_sCKST] = _(__ERROR_SERVER_UNKNOWN_VALUE, ":RetryCount = '[% :RetryCount %]'")
FIN
// Summary
RENVOYER (TableauOccurrence(:CKSTs) = 0)
// Error management
CAS ERREUR:
ErreurPropage()
CAS EXCEPTION:
ExceptionPropage()

Procedure PROTÉGÉE DelayCount(LOCAL _nRetryCount est un entier sans signe sur 4 octets) <sans pas à pas>: Durée
// Gestion des erreurs
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)
// Valeur automatique renvoyer à la fin de la procedure
RETOUR = :Delay
//
_nRetryCount -= 2
// Delay
_xDelay est une Durée
// Mode
SELON :DelayMode
// Constant at each iteraction
CAS Default
_xDelay = :Delay
// Incremented at each iteraction
CAS Incremented
_xDelay = :Delay + (_nRetryCount * :DelayIncrement)
// Double at each iteraction
CAS Doubled
_xDelay = (_nRetryCount = 0)? :Delay SINON (:Delay * Puissance(2, _nRetryCount))
FIN
// Summary
RENVOYER _xDelay
// Error management
CAS ERREUR:
ErreurPropage()
CAS EXCEPTION:
ExceptionPropage()

Procedure PUBLIC Run(*): boolean
// Gestion des erreurs
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)
// Valeur automatique renvoyer à la fin de la procedure
RETOUR = Faux
// Retry counter
POUR _nRetryCount = 1 _À_ :RetryCount
// Internal retry counter
SI _nRetryCount > 1 ALORS
// Temporisation
SELON Vrai
// Run in a service ?
CAS EnModeService()
// Multitask, Time-out or ThreadPause must not be used in a Service application.
// http://doc.windev.com/en-US/?1000018712&lang=fr-FR&productversion=xxF230031j
ServiceTemporise(:DelayCount(_nRetryCount))
// Run in a thread ?
CAS ThreadCourant() <> ""
// Use ThreadPause instead of Multitask or Wait when several threads are used
// http://doc.windev.com/en-US/?3077029&lang=fr-FR&productversion=xxF230031j
ThreadPause(:DelayCount(_nRetryCount))
// Others
AUTRE CAS
// Give control back to Windows and to the WLanguage
// http://doc.windev.com/en-US/?3015004&lang=fr-FR&productversion=xxF230031j
Multitâche(-:DelayCount(_nRetryCount))
FIN
FIN
// TProcedureBefore
SI PAS :TProcedureBefore = Null ALORS
:TProcedureBefore(_nRetryCount)
FIN
// TProcedure
:TProcedure(MesParamètres)
// ErrorOccurred ?
SI ErreurDétectée ALORS
SELON ErreurInfo(errCode)
// Service Unavailable
CAS __ERROR_SERVER_SERVICE_UNAVAILABLE_CODE
CONTINUE
// Internal error
CAS __ERROR_SERVER_INTERNAL_CODE
// Propagates the error
ErreurPropage()
RENVOYER Faux
// Others
AUTRE CAS
// Propagates the error
ErreurPropage()
RENVOYER Faux
FIN
SINON
// TProcedureAfter
SI PAS :TProcedureAfter = Null ALORS
:TProcedureAfter()
FIN
// All goods, we leave ;)
BREAK
FIN
FIN
// Summary
RENVOYER Vrai
// Error management
CAS ERREUR:
ErreurPropage()
CAS EXCEPTION:
ExceptionPropage()


#WLoodies #LaPiraterieNEstJamaisFinie #92i #SombreHistoireTristeMelo


--
In üs we trust - #92i
Message modifié, 05 août 2018 - 20:11
Membre enregistré
120 messages
Popularité : +13 (15 votes)
Posté le 07 août 2018 - 11:21
Bonjour,
Pour ma part, j'utilise une surcharge de la commnande hexecuterequetesql.
J'ai remarqué que la commande est en erreur avec le message "server gone away", mais que cette requete en erreur a suffit à réouvrir la connexion.
Donc l'idée est que si j'ai une erreur de requête avec dans le message "server gone away", alors je retente ma requete.
Si je suis toujours en erreur, au deuxième coup, je n'insiste pas. Cette méthode fonctionne très bien pour moi.

Procedure HExécuteRequêteSQL(_Source,_Connexion=Null,_Mode=Null,_RequeteSQL=Null)

SI _Connexion=Null ALORS
// Avec syntaxe "requete sql/source WD23"
SI PAS WL.HExécuteRequêteSQL(_Source) ALORS
// Perte de serveur, je retente sans rien dire. Apparemment, la connexion se rouvre après une erreur.
SI Position(HErreurInfo(hErrMessage),"server has gone away")>0 ALORS
SI PAS WL.HExécuteRequêteSQL(_Source) ALORS
AjoutLog("Erreur de requête SQL"+RC+_Source+RC+HErreurInfo(hErrMessage),"INFO",gEMailBug)
RENVOYER Faux
SINON
AjoutLog("Perte de serveur récupérée","",gEMailBug)
FIN
FIN
AjoutLog("Erreur de requête SQL"+RC+_Source+RC+HErreurInfo(hErrMessage),"INFO",gEMailBug)
RENVOYER Faux
FIN
SINON
// Gérer les différentes syntaxes de hexecuterequeteSQL
FIN
Message modifié, 07 août 2018 - 11:25
Membre enregistré
80 messages
Popularité : +4 (4 votes)
Posté le 29 septembre 2020 - 16:40
Merci à tous . :merci: