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 ????
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <Mikado@libertysurf.fr> a écrit dans le message de
news:%23lsdfZpkFHA.3568@TK2MSFTNGP10.phx.gbl...
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 ????
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
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
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é !
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
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
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
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
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
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" <Mikado@libertysurf.fr> a écrit dans le message de
news:OMXnJjqkFHA.3316@TK2MSFTNGP14.phx.gbl...
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
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