OVH Cloud OVH Cloud

Erreur de connexion (pool)...

5 réponses
Avatar
Mikado
Salut à tous,

Dans mon application j'ai un timer qui appelle une procédure stockée de ma
base. Le timer, toutes les deux secondes, ouvre une connection, récupère des
infos via un datareader, ferme le datareader et ferme enfin la connection
(j'ai même testé avec un dispose à la fin de la fonction).

D'après ce que plusieurs utilisateurs m'avaient expliqués, au contraire de
la précédente version d'ADO, il suffit d'ouvrir une connection quand on a
besoin et .Net ce charge via un pool de connection de se connecter à la
base. Bon ok en théorie j'ai compris...

Seulement voilà... au bout d'un moment je me retrouve avec une erreur... au
départ je cherche à comprendre car malgré un Try/Catch l'erreur n'est pas
levée... Je termine finalement par comprendre que les erreurs de type
InvalidCastException ne sont pas levées par Exception (je pensais celui-ci
était généraliste ?!) mais bon passons... Je regarde l'erreur et j'obtiens
ceci :

"Expiration du délai d'attente. Le délai d'attente s'est écoulé avant
obtention d'un connexion du pool. Ceci est probablement dû au fait que
toutes les connexions regroupées sont en cours d'utilisation et la taille
maximale du pool a été atteinte."

Je regarde donc dans ma base SQLServer et chaque utilisateur se retrouve au
bout d'un moment avec 100 connections !!! Je suis pas certain qu'au niveau
performance ce soit super (côté Client et côté Serveur) et à la 101ème ça
casse... Quelqu'un peut me dire ce que je fais mal ????

Merci

Jérôme

5 réponses

Avatar
Patrice
Des connexions ne sont pas fermées. Peut-être au niveau du DataReader ? Voir
aussi au niveau du traitement des erreurs (par exemple des erreurs qui
ferait que l'appli. ne ferme pas la connexion ?)

--
Patrice

"Mikado" a écrit dans le message de
news:%
Salut à tous,

Dans mon application j'ai un timer qui appelle une procédure stockée de ma
base. Le timer, toutes les deux secondes, ouvre une connection, récupère


des
infos via un datareader, ferme le datareader et ferme enfin la connection
(j'ai même testé avec un dispose à la fin de la fonction).

D'après ce que plusieurs utilisateurs m'avaient expliqués, au contraire de
la précédente version d'ADO, il suffit d'ouvrir une connection quand on a
besoin et .Net ce charge via un pool de connection de se connecter à la
base. Bon ok en théorie j'ai compris...

Seulement voilà... au bout d'un moment je me retrouve avec une erreur...


au
départ je cherche à comprendre car malgré un Try/Catch l'erreur n'est pas
levée... Je termine finalement par comprendre que les erreurs de type
InvalidCastException ne sont pas levées par Exception (je pensais celui-ci
était généraliste ?!) mais bon passons... Je regarde l'erreur et j'obtiens
ceci :

"Expiration du délai d'attente. Le délai d'attente s'est écoulé avant
obtention d'un connexion du pool. Ceci est probablement dû au fait que
toutes les connexions regroupées sont en cours d'utilisation et la taille
maximale du pool a été atteinte."

Je regarde donc dans ma base SQLServer et chaque utilisateur se retrouve


au
bout d'un moment avec 100 connections !!! Je suis pas certain qu'au niveau
performance ce soit super (côté Client et côté Serveur) et à la 101ème ça
casse... Quelqu'un peut me dire ce que je fais mal ????

Merci

Jérôme




Avatar
aitoz
Salut,

Peut-être qu'effectivement tes connexions ne se referment pas ?
Essaye de voir si ca passe en m'etant un timer plus long que 2 secondes et
ré-essaye avec un dispose bien placé !

bonne journée
Avatar
Mikado
Voilà la méthode ... si quelqu'un y comprends qq choses :

Public Function GetLockInfo() As Byte
Dim Connection As SqlConnection = New SqlConnection
Connection.ConnectionString = dbConnectionString
Try
Connection.Open()
Dim Command As New SqlCommand
Command.Connection = Connection
Command.CommandText = "qryGet_Soft_LockInfo"
Command.CommandType = CommandType.StoredProcedure

Dim Data As SqlDataReader
Data = Command.ExecuteReader
If Data.Read Then return CByte(Data("smlEnumState"))
Data.Close()
Connection.Close()
Catch ex As Exception
RenderFatalError(ex)
End Try
Connection.Dispose()
End Function

Vous voyez bien que je ferme tout ou il faut !!

Si vous avez des idées !

Jérôme
Avatar
Patrice
Je pense que le problème est l'instruction Return. Elle provoque la fin
immédiate de la fonction et la suite (c'est justement la fermeture) n'est
pas appelé.

Voir (en français) :
http://msdn.microsoft.com/library/fre/default.asp?url=/library/fre/vblr7/html/vastmReturn.asp

--
Patrice

"Mikado" a écrit dans le message de
news:
Voilà la méthode ... si quelqu'un y comprends qq choses :

Public Function GetLockInfo() As Byte
Dim Connection As SqlConnection = New SqlConnection
Connection.ConnectionString = dbConnectionString
Try
Connection.Open()
Dim Command As New SqlCommand
Command.Connection = Connection
Command.CommandText = "qryGet_Soft_LockInfo"
Command.CommandType = CommandType.StoredProcedure

Dim Data As SqlDataReader
Data = Command.ExecuteReader
If Data.Read Then return CByte(Data("smlEnumState"))
Data.Close()
Connection.Close()
Catch ex As Exception
RenderFatalError(ex)
End Try
Connection.Dispose()
End Function

Vous voyez bien que je ferme tout ou il faut !!

Si vous avez des idées !

Jérôme




Avatar
Mikado
C'était trop évident... :) :) :)

Merci!