Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[mysql4wd] eviter les connexions persistantes

5 réponses
Avatar
Roumegou Eric
Bonjour,

je me lance dans la résolution d'un pb que j'ai jusque là éludé.
Lors de l'utilisation de mysql4wd dans un site internet, on va
multiplier les sessions en sleep.
Avant j'ouvrais une session en début de projet et je la fermais en fin
de session.
Mais en cas de grosse charge, on arrive assez vite à un nbre de cnx
trop important.
J'ai donc rajouté un indicateur booleen myModeConnecter et une méthode
SetModeConnecter.

Si je lance la methode SetModeConnecter(True) avant mon sqlconnecte, je
sauvegarde la chaine de connexion au lieu de me connecter.

Ensuite j(ai surchargé mySQLExec comme suit


// rajout er 09/10/2006 gestion des connexions non persistantes
IF (:myModeDeconnecter = True) THEN
host= ExtraitChaîne(:myConnectString,1)
user= ExtraitChaîne(:myConnectString,2)
passwd= ExtraitChaîne(:myConnectString,3)
db= ExtraitChaîne(:myConnectString,4)
myPort=Val(ExtraitChaîne(:myConnectString,5))
myClientFlag=Val(ExtraitChaîne(:myConnectString,7))

retCode = AppelDLL32("mySQL4WD", "mySQLConnecte", host, user, passwd,
db, myPort, Null, myClientFlag)
IF (retCode < 0 OR retCode > 1) THEN
// oui, je sais, c'est pas joli, joli... ;-)
:mySQLErreur = retCode
RENVOYER False
END
END

principe ; je me connecte avant le mysql avec les param que j'avais
sauvegardés.

et dans mysqlferme

PROCEDURE mySQLFerme(requestNumber)

LOCAL
myRequestNumber is int

myRequestNumber = requestNumber
AppelDLL32("mySQL4WD", "mySQLFerme", myRequestNumber)

IF :myModeDeconnecter = True THEN
AppelDLL32("mySQL4WD", "mySQLDeconnecte")
END


Cela semble fonctionner et (à priori) sans trop de dégradation des
temps de réponse (ce que je craignais).
Par contre j'ai toujours mes sessions mysql en sleep et qui ne
s'effaceront qu'à la fermture du site WB.

Pourquoi le mysqldeconnecte ne suffit-il pas à supprimer cette session
?

Merci de vos réponses.

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)

5 réponses

Avatar
Firetox
Bonjour,

car la dll est toujours chargée sur tout la libMySQL.dl. c'est elle qui a le
contexte mySQL pour la connexion.
donc tant quelle sera en memoire il y aura un lien sur le serveur

il faudrait egalement decharge l'objet dll. en fait ce que tu cherche a
faire est assez simple il faut declarer l'objet mySQL4wd quand tu dois faire
la requete
la destruction de l'objet enlevera egalement la session sur le serveur.
maintenant le fait e charger la dll a chaque requete peut degrader les perf
mais c'est a verifier dans quelles mesures.
sinon il faut utiliser un acces sans dll comme php4wd qui se connecte a
chaque requete et utilise se mecanisme.

le plus simple est de ne pas touché au code de mySQL4WD car a la prochaine
version tu devra refaire les modif. car la classe verfie la version aupres
de la dll
et d'instancier l'objet au moment ou tu en as besoin et plus dans l'init du
projet

@+

"Roumegou Eric" a écrit dans le message de news:

Bonjour,

je me lance dans la résolution d'un pb que j'ai jusque là éludé.
Lors de l'utilisation de mysql4wd dans un site internet, on va multiplier
les sessions en sleep.
Avant j'ouvrais une session en début de projet et je la fermais en fin de
session.
Mais en cas de grosse charge, on arrive assez vite à un nbre de cnx trop
important.
J'ai donc rajouté un indicateur booleen myModeConnecter et une méthode
SetModeConnecter.

Si je lance la methode SetModeConnecter(True) avant mon sqlconnecte, je
sauvegarde la chaine de connexion au lieu de me connecter.

Ensuite j(ai surchargé mySQLExec comme suit


// rajout er 09/10/2006 gestion des connexions non persistantes
IF (:myModeDeconnecter = True) THEN
host= ExtraitChaîne(:myConnectString,1)
user= ExtraitChaîne(:myConnectString,2)
passwd= ExtraitChaîne(:myConnectString,3)
db= ExtraitChaîne(:myConnectString,4)
myPort=Val(ExtraitChaîne(:myConnectString,5))
myClientFlag=Val(ExtraitChaîne(:myConnectString,7))

retCode = AppelDLL32("mySQL4WD", "mySQLConnecte", host, user, passwd, db,
myPort, Null, myClientFlag)
IF (retCode < 0 OR retCode > 1) THEN
// oui, je sais, c'est pas joli, joli... ;-)
:mySQLErreur = retCode
RENVOYER False
END
END

principe ; je me connecte avant le mysql avec les param que j'avais
sauvegardés.

et dans mysqlferme

PROCEDURE mySQLFerme(requestNumber)

LOCAL
myRequestNumber is int

myRequestNumber = requestNumber
AppelDLL32("mySQL4WD", "mySQLFerme", myRequestNumber)

IF :myModeDeconnecter = True THEN
AppelDLL32("mySQL4WD", "mySQLDeconnecte")
END


Cela semble fonctionner et (à priori) sans trop de dégradation des temps
de réponse (ce que je craignais).
Par contre j'ai toujours mes sessions mysql en sleep et qui ne
s'effaceront qu'à la fermture du site WB.

Pourquoi le mysqldeconnecte ne suffit-il pas à supprimer cette session ?

Merci de vos réponses.

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)




Avatar
Roumegou Eric
Merci Fred

Firetox a exposé le 10/10/2006 :
Bonjour,

car la dll est toujours chargée sur tout la libMySQL.dl. c'est elle qui a le
contexte mySQL pour la connexion.
donc tant quelle sera en memoire il y aura un lien sur le serveur

il faudrait egalement decharge l'objet dll. en fait ce que tu cherche a faire
est assez simple il faut declarer l'objet mySQL4wd quand tu dois faire la
requete
la destruction de l'objet enlevera egalement la session sur le serveur.
maintenant le fait e charger la dll a chaque requete peut degrader les perf
mais c'est a verifier dans quelles mesures.



hum !! j'attendrais ce we pour faire des tests et s/un serveur de test
alors.

sinon il faut utiliser un acces sans dll comme php4wd qui se connecte a
chaque requete et utilise se mecanisme.



je pense que cela représenterait trop de modifs.
Sinon, fait-elle tout ce que fait mysql4wd ? On la trouve sur
sqlmanagerX ?


le plus simple est de ne pas touché au code de mySQL4WD car a la prochaine
version tu devra refaire les modif. car la classe verfie la version aupres de
la dll



j'ai du déjà la modifier à cause de webdev et pour compatibilité avec
les autres accès (mais ça je pense que cela avait été pris en compte)

et d'instancier l'objet au moment ou tu en as besoin et plus dans l'init du
projet



Beaucoup plus complexe et cela implique de reprendre les pages une à
une.
Mais peut être est-ce la solution ? reperer et isoler pour chaque page
les accès à la base de donnée et avoir des méthodes dans une classe
indépendante qui ferait un SetBaseOn, SetBaseOff.
et ces méthodes instancieraient l'objet, connecterait à la base et
deconnecterait/libérerait l'objet.

C'est vrai que si je charge des données en faisant une requete, puis 3
ou 4 autres requetes ; c'est idiot de connecter/déconnecter à chaque
fois.

Sinon une question : pour libérer la libmysql.dll et par la mème la
session mysql, un liberer fSQL suffirait (fSQL étant l'objet mysql4wd)
?



@+

"Roumegou Eric" a écrit dans le message de news:

Bonjour,

je me lance dans la résolution d'un pb que j'ai jusque là éludé.
Lors de l'utilisation de mysql4wd dans un site internet, on va multiplier
les sessions en sleep.
Avant j'ouvrais une session en début de projet et je la fermais en fin de
session.
Mais en cas de grosse charge, on arrive assez vite à un nbre de cnx trop
important.
J'ai donc rajouté un indicateur booleen myModeConnecter et une méthode
SetModeConnecter.

Si je lance la methode SetModeConnecter(True) avant mon sqlconnecte, je
sauvegarde la chaine de connexion au lieu de me connecter.

Ensuite j(ai surchargé mySQLExec comme suit


// rajout er 09/10/2006 gestion des connexions non persistantes
IF (:myModeDeconnecter = True) THEN
host= ExtraitChaîne(:myConnectString,1)
user= ExtraitChaîne(:myConnectString,2)
passwd= ExtraitChaîne(:myConnectString,3)
db= ExtraitChaîne(:myConnectString,4)
myPort=Val(ExtraitChaîne(:myConnectString,5))
myClientFlag=Val(ExtraitChaîne(:myConnectString,7))

retCode = AppelDLL32("mySQL4WD", "mySQLConnecte", host, user, passwd, db,
myPort, Null, myClientFlag)
IF (retCode < 0 OR retCode > 1) THEN
// oui, je sais, c'est pas joli, joli... ;-)
:mySQLErreur = retCode
RENVOYER False
END
END

principe ; je me connecte avant le mysql avec les param que j'avais
sauvegardés.

et dans mysqlferme

PROCEDURE mySQLFerme(requestNumber)

LOCAL
myRequestNumber is int

myRequestNumber = requestNumber
AppelDLL32("mySQL4WD", "mySQLFerme", myRequestNumber)

IF :myModeDeconnecter = True THEN
AppelDLL32("mySQL4WD", "mySQLDeconnecte")
END


Cela semble fonctionner et (à priori) sans trop de dégradation des temps de
réponse (ce que je craignais).
Par contre j'ai toujours mes sessions mysql en sleep et qui ne s'effaceront
qu'à la fermture du site WB.

Pourquoi le mysqldeconnecte ne suffit-il pas à supprimer cette session ?

Merci de vos réponses.

-- Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)







--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou Eric
[CUT]

Beaucoup plus complexe et cela implique de reprendre les pages une à une.
Mais peut être est-ce la solution ? reperer et isoler pour chaque page les
accès à la base de donnée et avoir des méthodes dans une classe indépendante
qui ferait un SetBaseOn, SetBaseOff.
et ces méthodes instancieraient l'objet, connecterait à la base et
deconnecterait/libérerait l'objet.




une question qui me vient ...
si je déclare en init de projet

fSQL est un objet dynamique

et dans une methode SetBaseOn de la classe c_Connexion , je fasse

fSQL=allouer c_mySQL4WD
puis cnx

et dans un autre methode SetBaseOff de cette classe je fasse
liberer fSQL

Ma méthode sera disponible depuis tout le projet ?
le fait de repasser dans SetBaseOn me réallouera l'objet ?


car si je fais dans SetBaseOn

fSQL est un objet mysql4WD

cette methode aura-t-elle une portée dans le projet ?
à moins que
PUBLIC
fSQL est un objet mysql4WD


Et un des ennuis de déclarer en dynamique est l'absence de la
completion dans l'éditeur de code (çà c'est pénible qd on a pris
l'habitude)

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
JeAn-PhI
Roumegou Eric a écrit :
[CUT]

Beaucoup plus complexe et cela implique de reprendre les pages une à une.
Mais peut être est-ce la solution ? reperer et isoler pour chaque page les
accès à la base de donnée et avoir des méthodes dans une classe
indépendante qui ferait un SetBaseOn, SetBaseOff.
et ces méthodes instancieraient l'objet, connecterait à la base et
deconnecterait/libérerait l'objet.




une question qui me vient ...
si je déclare en init de projet

fSQL est un objet dynamique

et dans une methode SetBaseOn de la classe c_Connexion , je fasse

fSQL=allouer c_mySQL4WD
puis cnx

et dans un autre methode SetBaseOff de cette classe je fasse
liberer fSQL

Ma méthode sera disponible depuis tout le projet ?
le fait de repasser dans SetBaseOn me réallouera l'objet ?


car si je fais dans SetBaseOn

fSQL est un objet mysql4WD

cette methode aura-t-elle une portée dans le projet ?
à moins que
PUBLIC
fSQL est un objet mysql4WD


Et un des ennuis de déclarer en dynamique est l'absence de la completion dans
l'éditeur de code (çà c'est pénible qd on a pris l'habitude)



pour la complétion mettre :
fSQL est un objet mysql4WD dynamique

--
Cordialement JeAn-PhI
Avatar
Roumegou Eric
JeAn-PhI a couché sur son écran :
Roumegou Eric a écrit :
[CUT]

Beaucoup plus complexe et cela implique de reprendre les pages une à une.
Mais peut être est-ce la solution ? reperer et isoler pour chaque page les
accès à la base de donnée et avoir des méthodes dans une classe
indépendante qui ferait un SetBaseOn, SetBaseOff.
et ces méthodes instancieraient l'objet, connecterait à la base et
deconnecterait/libérerait l'objet.




une question qui me vient ...
si je déclare en init de projet

fSQL est un objet dynamique

et dans une methode SetBaseOn de la classe c_Connexion , je fasse

fSQL=allouer c_mySQL4WD
puis cnx

et dans un autre methode SetBaseOff de cette classe je fasse
liberer fSQL

Ma méthode sera disponible depuis tout le projet ?
le fait de repasser dans SetBaseOn me réallouera l'objet ?


car si je fais dans SetBaseOn

fSQL est un objet mysql4WD

cette methode aura-t-elle une portée dans le projet ?
à moins que
PUBLIC
fSQL est un objet mysql4WD


Et un des ennuis de déclarer en dynamique est l'absence de la completion
dans l'éditeur de code (çà c'est pénible qd on a pris l'habitude)



pour la complétion mettre :
fSQL est un objet mysql4WD dynamique



Oh ??? ça ça m'interesse !!!!

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)