sqlconnection asp.net 1.1

Le
Richard Urrutia
Bonjour,
j'ai rencontré un bug sur mon site en asp.net 1.1 qui me semble lié à un
problème de connexion à sql serveur.

Il semblerait que parfois mon serveur sql ne réponde pas dans les délais
impartis et provoque un Time out error.
Ce qui pose problème, c'est que par la suite, lorsque le processus sql est
finit et que la base est disponible, la méthode sqlconnection.open() ne
fonctionne plus.
J'ai également fait un autre test en mode debug en arretant mon serveur sql
de test pendant mon surf. Cette fois ma méthode sqlconnection.open() répond
ok alors que le serveur sql n'est plus en ligne.

J'ai l'impression que le serveur web mémorise un etat de connexion sql qui
n'est plus valide.

est ce que quelqu'un aurait rencontré ce genre de problème ?

merci d'avance

richard
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrick Philippot
Le #12144921
Bonjour,

J'ai l'impression que le serveur web mémorise un etat de connexion
sql qui n'est plus valide.



C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites un Close
explicite avant de tenter une réouverture. Juste pour tester. Si ça marche,
c'est bien un problème de pooling.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Patrick Philippot
Le #12144911
Patrick Philippot wrote:
C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites
un Close explicite avant de tenter une réouverture. Juste pour
tester. Si ça marche, c'est bien un problème de pooling.



Ooops, désolé. ClearPool n'est pas dispo en ADO .Net 1.1.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Patrick Philippot
Le #12144901
Patrick Philippot wrote:
C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites
un Close explicite avant de tenter une réouverture. Juste pour
tester. Si ça marche, c'est bien un problème de pooling.



En 1.1, la seule solution pour faire un reset du pool est de retourner la
connexion au pool (Close/Dispose ) et d'attendre ensuite l'expiration de la
connexion dans le pool. Par défaut c'est 4 heures je crois mais on peut le
changer dans la connection string: ";Connection Lifetime0" (en secondes)

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Richard Urrutia
Le #12144891
Bonjour Patrick, et merci de ta réponse.

Est ce que tu as déjà rencontré ce type de problème ? car ce bug est très
pénalisant, il fait planter l'ensemble de mon site !!!
J'ai une question sur le Connection LifeTime. si je le limite à 30s ça veut
dire que quoi qu'il arrive ma connexion sera fermé dans les 30s ?


"Patrick Philippot" news:u2Wnj$
Patrick Philippot wrote:
C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites
un Close explicite avant de tenter une réouverture. Juste pour
tester. Si ça marche, c'est bien un problème de pooling.



En 1.1, la seule solution pour faire un reset du pool est de retourner la
connexion au pool (Close/Dispose ) et d'attendre ensuite l'expiration de
la connexion dans le pool. Par défaut c'est 4 heures je crois mais on peut
le changer dans la connection string: ";Connection Lifetime0" (en
secondes)

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr





Patrick Philippot
Le #12144881
Richard Urrutia wrote:
Est ce que tu as déjà rencontré ce type de problème ? car ce bug est
très pénalisant, il fait planter l'ensemble de mon site !!!



Pesonnellement, non.

J'ai une question sur le Connection LifeTime. si je le limite à 30s
ça veut dire que quoi qu'il arrive ma connexion sera fermé dans les
30s ?



Non, cette valeur indique la durée de vie d'une connexion non ré-utilisée
dans le pool. Si elle est utilisée, bien sûr qu'elle ne sera pas coupée.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Patrice
Le #12144871
Non plus. Même si la solution de Philippe est mise en oeuvre, il serait sans
doute intéressant de voir si la source du problème original peut-être
trouvée (un pb de connectivité, résolution de nom, pb serveur ou autre ???)

Déjà vois si il 'agit d'un timeout de connection ou de commande ou même un
problème de pool plein (je crois que le message indique dans ce cas
qu'aucune connexion libre n'est trouvée au bout d'un "timeout" pendant
lequel l'application attends qu'une connexion se libère). Dans ce dernier
cas, ce serait donc des connexions qui ne sont pas correctement fermées.

En cas d'erreur, il est toujours préférable de poster le message exact pour
que le contexte soit bien restitué.

Bon courage.

--
Patrice

"Richard Urrutia" news:
Bonjour Patrick, et merci de ta réponse.

Est ce que tu as déjà rencontré ce type de problème ? car ce bug est très
pénalisant, il fait planter l'ensemble de mon site !!!
J'ai une question sur le Connection LifeTime. si je le limite à 30s ça
veut dire que quoi qu'il arrive ma connexion sera fermé dans les 30s ?


"Patrick Philippot" news:u2Wnj$
Patrick Philippot wrote:
C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites
un Close explicite avant de tenter une réouverture. Juste pour
tester. Si ça marche, c'est bien un problème de pooling.



En 1.1, la seule solution pour faire un reset du pool est de retourner la
connexion au pool (Close/Dispose ) et d'attendre ensuite l'expiration de
la connexion dans le pool. Par défaut c'est 4 heures je crois mais on
peut le changer dans la connection string: ";Connection Lifetime0" (en
secondes)

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr









Richard Urrutia
Le #12144861
Bonjour,
je continue mes tests sur mon problème et cette fois ci j'ai un message
différent.
J'ai utilisé Application Center test pour effectuer un test de charge sur
une page du site qui execute plusieurs requete sur la base et cette fois ci
j'ai le message suivant :

Timeout expired. The timeout period elapsed prior to obtaining a connection
from the pool. This may have occured because all pooled connections were in
use and max pool size was reached.

ce qui est étrange est que j'envoi ce message d'erreur après avoir fait un
.Close() sur ma connexion et qu'il revient systématiquement par la suite.

voici le code qui génère l'erreur
if(_Connection==null)

_Connection=ConnexionFactory.Instance.CreateConnection();



if (_Connection.State != ConnectionState.Open)

{

try

{

_Connection.Open();

}

catch ( Exception ex )

{

Close();

if( Tracer.IsTraceLevel((int)TracerLevel.SqlError))

Tracer.Instance.TraceMessage( (int)TracerLevel.SqlError, "SQLERROR",
"Traceur","Echec ouverture de connexion", ex.Message );

return false;

}



et voici la méthode close()



public bool Close()

{

if( _Connection==null)

return true;

if( _Transaction !=null)

{

ConnexionFactory.Instance.RemoveConnection(_Connection );

_Connection.Close();

throw new Exception("Close sans fermeture d'une transaction");

}

ConnexionFactory.Instance.RemoveConnection(_Connection );

_Connection.Close();

//_Cache=null;

_Transaction=null;

return true;

}



"Patrice" news:%
Non plus. Même si la solution de Philippe est mise en oeuvre, il serait
sans doute intéressant de voir si la source du problème original peut-être
trouvée (un pb de connectivité, résolution de nom, pb serveur ou autre
???)

Déjà vois si il 'agit d'un timeout de connection ou de commande ou même un
problème de pool plein (je crois que le message indique dans ce cas
qu'aucune connexion libre n'est trouvée au bout d'un "timeout" pendant
lequel l'application attends qu'une connexion se libère). Dans ce dernier
cas, ce serait donc des connexions qui ne sont pas correctement fermées.

En cas d'erreur, il est toujours préférable de poster le message exact
pour que le contexte soit bien restitué.

Bon courage.

--
Patrice

"Richard Urrutia" news:
Bonjour Patrick, et merci de ta réponse.

Est ce que tu as déjà rencontré ce type de problème ? car ce bug est très
pénalisant, il fait planter l'ensemble de mon site !!!
J'ai une question sur le Connection LifeTime. si je le limite à 30s ça
veut dire que quoi qu'il arrive ma connexion sera fermé dans les 30s ?


"Patrick Philippot" news:u2Wnj$
Patrick Philippot wrote:
C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites
un Close explicite avant de tenter une réouverture. Juste pour
tester. Si ça marche, c'est bien un problème de pooling.



En 1.1, la seule solution pour faire un reset du pool est de retourner
la connexion au pool (Close/Dispose ) et d'attendre ensuite l'expiration
de la connexion dans le pool. Par défaut c'est 4 heures je crois mais on
peut le changer dans la connection string: ";Connection Lifetime0" (en
secondes)

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr













Patrick Philippot
Le #12144851
Richard Urrutia wrote:
Timeout expired. The timeout period elapsed prior to obtaining a
connection from the pool. This may have occured because all pooled
connections were in use and max pool size was reached.



Bonjour,

Reste à tester si une augmentation du timeout ou de la taille du spool fait
bouger quelque chose. Ça sera déjà une indication sur la validité du message
d'erreur.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Patrice
Le #12144821
Donc à piroir soit la charge est vraiment vraiment importante (je crois me
souvenir que par défaut la taille maxi du pool est de 100 connexions) soit
toutes les connexions ne sont pas forcément fermées (elles sont apparemment
ajoutée/retirée dans une collection (but ?), il devrait donc être assez
facile de voir si elles en sont bien retirées et si non si elles sont bien
fermées...

Je pense qu'il pourrait être également intéressant de revenir au message
d'erreur initial pour voir de quoi il s'agit exactement plutôt que de le
contourner (les deux problèmes ne sont peut-être pas liés mais sait on
jamais...)

--
Patrice

"Richard Urrutia" news:
Bonjour,
je continue mes tests sur mon problème et cette fois ci j'ai un message
différent.
J'ai utilisé Application Center test pour effectuer un test de charge sur
une page du site qui execute plusieurs requete sur la base et cette fois
ci j'ai le message suivant :

Timeout expired. The timeout period elapsed prior to obtaining a
connection from the pool. This may have occured because all pooled
connections were in use and max pool size was reached.

ce qui est étrange est que j'envoi ce message d'erreur après avoir fait un
.Close() sur ma connexion et qu'il revient systématiquement par la suite.

voici le code qui génère l'erreur
if(_Connection==null)

_Connection=ConnexionFactory.Instance.CreateConnection();



if (_Connection.State != ConnectionState.Open)

{

try

{

_Connection.Open();

}

catch ( Exception ex )

{

Close();

if( Tracer.IsTraceLevel((int)TracerLevel.SqlError))

Tracer.Instance.TraceMessage( (int)TracerLevel.SqlError, "SQLERROR",
"Traceur","Echec ouverture de connexion", ex.Message );

return false;

}



et voici la méthode close()



public bool Close()

{

if( _Connection==null)

return true;

if( _Transaction !=null)

{

ConnexionFactory.Instance.RemoveConnection(_Connection );

_Connection.Close();

throw new Exception("Close sans fermeture d'une transaction");

}

ConnexionFactory.Instance.RemoveConnection(_Connection );

_Connection.Close();

//_Cache=null;

_Transaction=null;

return true;

}



"Patrice" news:%
Non plus. Même si la solution de Philippe est mise en oeuvre, il serait
sans doute intéressant de voir si la source du problème original
peut-être trouvée (un pb de connectivité, résolution de nom, pb serveur
ou autre ???)

Déjà vois si il 'agit d'un timeout de connection ou de commande ou même
un problème de pool plein (je crois que le message indique dans ce cas
qu'aucune connexion libre n'est trouvée au bout d'un "timeout" pendant
lequel l'application attends qu'une connexion se libère). Dans ce dernier
cas, ce serait donc des connexions qui ne sont pas correctement fermées.

En cas d'erreur, il est toujours préférable de poster le message exact
pour que le contexte soit bien restitué.

Bon courage.

--
Patrice

"Richard Urrutia" news:
Bonjour Patrick, et merci de ta réponse.

Est ce que tu as déjà rencontré ce type de problème ? car ce bug est
très pénalisant, il fait planter l'ensemble de mon site !!!
J'ai une question sur le Connection LifeTime. si je le limite à 30s ça
veut dire que quoi qu'il arrive ma connexion sera fermé dans les 30s ?


"Patrick Philippot" news:u2Wnj$
Patrick Philippot wrote:
C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites
un Close explicite avant de tenter une réouverture. Juste pour
tester. Si ça marche, c'est bien un problème de pooling.



En 1.1, la seule solution pour faire un reset du pool est de retourner
la connexion au pool (Close/Dispose ) et d'attendre ensuite
l'expiration de la connexion dans le pool. Par défaut c'est 4 heures je
crois mais on peut le changer dans la connection string: ";Connection
Lifetime0" (en secondes)

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr

















Richard Urrutia
Le #12144801
en fait la collection me permet de compter le nombre de connexion active
présente. J'ai monitéré la variable collection.count aujourd'hui et je n'ai
pas dépassé les 15 connexions.
en meme temps, mon site n'est pas tombé :-)


"Patrice" news:
Donc à piroir soit la charge est vraiment vraiment importante (je crois me
souvenir que par défaut la taille maxi du pool est de 100 connexions) soit
toutes les connexions ne sont pas forcément fermées (elles sont
apparemment ajoutée/retirée dans une collection (but ?), il devrait donc
être assez facile de voir si elles en sont bien retirées et si non si
elles sont bien fermées...

Je pense qu'il pourrait être également intéressant de revenir au message
d'erreur initial pour voir de quoi il s'agit exactement plutôt que de le
contourner (les deux problèmes ne sont peut-être pas liés mais sait on
jamais...)

--
Patrice

"Richard Urrutia" news:
Bonjour,
je continue mes tests sur mon problème et cette fois ci j'ai un message
différent.
J'ai utilisé Application Center test pour effectuer un test de charge sur
une page du site qui execute plusieurs requete sur la base et cette fois
ci j'ai le message suivant :

Timeout expired. The timeout period elapsed prior to obtaining a
connection from the pool. This may have occured because all pooled
connections were in use and max pool size was reached.

ce qui est étrange est que j'envoi ce message d'erreur après avoir fait
un .Close() sur ma connexion et qu'il revient systématiquement par la
suite.

voici le code qui génère l'erreur
if(_Connection==null)

_Connection=ConnexionFactory.Instance.CreateConnection();



if (_Connection.State != ConnectionState.Open)

{

try

{

_Connection.Open();

}

catch ( Exception ex )

{

Close();

if( Tracer.IsTraceLevel((int)TracerLevel.SqlError))

Tracer.Instance.TraceMessage( (int)TracerLevel.SqlError, "SQLERROR",
"Traceur","Echec ouverture de connexion", ex.Message );

return false;

}



et voici la méthode close()



public bool Close()

{

if( _Connection==null)

return true;

if( _Transaction !=null)

{

ConnexionFactory.Instance.RemoveConnection(_Connection );

_Connection.Close();

throw new Exception("Close sans fermeture d'une transaction");

}

ConnexionFactory.Instance.RemoveConnection(_Connection );

_Connection.Close();

//_Cache=null;

_Transaction=null;

return true;

}



"Patrice" news:%
Non plus. Même si la solution de Philippe est mise en oeuvre, il serait
sans doute intéressant de voir si la source du problème original
peut-être trouvée (un pb de connectivité, résolution de nom, pb serveur
ou autre ???)

Déjà vois si il 'agit d'un timeout de connection ou de commande ou même
un problème de pool plein (je crois que le message indique dans ce cas
qu'aucune connexion libre n'est trouvée au bout d'un "timeout" pendant
lequel l'application attends qu'une connexion se libère). Dans ce
dernier cas, ce serait donc des connexions qui ne sont pas correctement
fermées.

En cas d'erreur, il est toujours préférable de poster le message exact
pour que le contexte soit bien restitué.

Bon courage.

--
Patrice

"Richard Urrutia" news:
Bonjour Patrick, et merci de ta réponse.

Est ce que tu as déjà rencontré ce type de problème ? car ce bug est
très pénalisant, il fait planter l'ensemble de mon site !!!
J'ai une question sur le Connection LifeTime. si je le limite à 30s ça
veut dire que quoi qu'il arrive ma connexion sera fermé dans les 30s ?


"Patrick Philippot" news:u2Wnj$
Patrick Philippot wrote:
C'est peut-être dû au pooling de connexions. Après l'erreur initiale,
appelez ClearPool voire un ClearAllPools sur la connexion et faites
un Close explicite avant de tenter une réouverture. Juste pour
tester. Si ça marche, c'est bien un problème de pooling.



En 1.1, la seule solution pour faire un reset du pool est de retourner
la connexion au pool (Close/Dispose ) et d'attendre ensuite
l'expiration de la connexion dans le pool. Par défaut c'est 4 heures
je crois mais on peut le changer dans la connection string:
";Connection Lifetime0" (en secondes)

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr





















Publicité
Poster une réponse
Anonyme