OVH Cloud OVH Cloud

SQLConnection object

5 réponses
Avatar
bnob
Dans mon ASP.net projet j'ai un grand nombre de connection à un SQL Server
Database. J'utilise une variabe globale pour ma connection que je déclare
dans un module(VB.Net code behind). J'ouvre ma connection dans ma default
page

Tout est ok mais quand je démarre depuis ma default page une page qui met 30
secondes pour s'afficher du à une requte assez long, et que pendant ces 30
secondes, un autre user ouvre une autre page depuis la default page, j'ai
une erreur : "... Datareader est déja ouvert....."

Je pense que c'est du à ma variable globale.

Une idée pour gérer au mieux les objets connection dans un projets utilisant
plusieurs pages dans lesquelles sont lancées plusieurs requetes?
A noter que je travaille toujours sur la meme base de données sur le serveur
SQL .

Merci pour vos réponses

5 réponses

Avatar
Paul Bacelar
Le plus simple et le plus performant est de maintenir la connexion le moins
de temps possible pour permettre un meilleur partages des connexions à la
base vie le connexion pooling.

Donc, pas de variable locale et création et fermeture de la connexion dans
chaque page.

Le connexion pooling, c'est magique ;)
--
Paul Bacelar


"bnob" wrote in message
news:
Dans mon ASP.net projet j'ai un grand nombre de connection à un SQL Server
Database. J'utilise une variabe globale pour ma connection que je déclare
dans un module(VB.Net code behind). J'ouvre ma connection dans ma default
page

Tout est ok mais quand je démarre depuis ma default page une page qui met


30
secondes pour s'afficher du à une requte assez long, et que pendant ces 30
secondes, un autre user ouvre une autre page depuis la default page, j'ai
une erreur : "... Datareader est déja ouvert....."

Je pense que c'est du à ma variable globale.

Une idée pour gérer au mieux les objets connection dans un projets


utilisant
plusieurs pages dans lesquelles sont lancées plusieurs requetes?
A noter que je travaille toujours sur la meme base de données sur le


serveur
SQL .

Merci pour vos réponses




Avatar
bnob
Ou créer la connection dans la page, au moment de l'event on_load et où
fermer la connection (dans quel event) ?

Si on la crée dans l'event on_load de la page, comment l'utiliser dans par
exemple un event click d'un bouton ?

"Paul Bacelar" a écrit dans le message
de news:
Le plus simple et le plus performant est de maintenir la connexion le


moins
de temps possible pour permettre un meilleur partages des connexions à la
base vie le connexion pooling.

Donc, pas de variable locale et création et fermeture de la connexion dans
chaque page.

Le connexion pooling, c'est magique ;)
--
Paul Bacelar


"bnob" wrote in message
news:
> Dans mon ASP.net projet j'ai un grand nombre de connection à un SQL


Server
> Database. J'utilise une variabe globale pour ma connection que je


déclare
> dans un module(VB.Net code behind). J'ouvre ma connection dans ma


default
> page
>
> Tout est ok mais quand je démarre depuis ma default page une page qui


met
30
> secondes pour s'afficher du à une requte assez long, et que pendant ces


30
> secondes, un autre user ouvre une autre page depuis la default page,


j'ai
> une erreur : "... Datareader est déja ouvert....."
>
> Je pense que c'est du à ma variable globale.
>
> Une idée pour gérer au mieux les objets connection dans un projets
utilisant
> plusieurs pages dans lesquelles sont lancées plusieurs requetes?
> A noter que je travaille toujours sur la meme base de données sur le
serveur
> SQL .
>
> Merci pour vos réponses
>
>




Avatar
Paul Bacelar
"bnob" wrote in message
news:
Ou créer la connection dans la page, au moment de l'event on_load et où
fermer la connection (dans quel event) ?



Vous créez la connexion le plus tard possible. Dans le on_load, c'est trop
tôt à mon goût car vous pouvez ne pas avoir besoin de récupérer de nouveau
les données pour cette nouvelle requête HTTP.



Si on la crée dans l'event on_load de la page, comment l'utiliser dans par
exemple un event click d'un bouton ?




C'est une démonstration du fait de vous connecter le plus tard possible car,
dans un event click, il est probable qu'il est plus pertinent d'utilisé un
DataSet qui sert de cache que de régénérer celui-ci (à moins que cela soit
un click sur un bouton refresh ;-) ). Si vous avez besoin de récupérer ces
données pour pouvoir les utiliser, le plus important c'est ces données et
pas la connexion que vous fermer dès que les données ont été récupérées.

Donc la propagation d'un objet connexion n'a pas d'intérêt, c'est la
propagation des données qui est importants.


"Paul Bacelar" a écrit dans le message
de news:
> Le plus simple et le plus performant est de maintenir la connexion le
moins
> de temps possible pour permettre un meilleur partages des connexions à


la
> base vie le connexion pooling.
>
> Donc, pas de variable locale et création et fermeture de la connexion


dans
> chaque page.
>
> Le connexion pooling, c'est magique ;)
> --
> Paul Bacelar
>
>
> "bnob" wrote in message
> news:
> > Dans mon ASP.net projet j'ai un grand nombre de connection à un SQL
Server
> > Database. J'utilise une variabe globale pour ma connection que je
déclare
> > dans un module(VB.Net code behind). J'ouvre ma connection dans ma
default
> > page
> >
> > Tout est ok mais quand je démarre depuis ma default page une page qui
met
> 30
> > secondes pour s'afficher du à une requte assez long, et que pendant


ces
30
> > secondes, un autre user ouvre une autre page depuis la default page,
j'ai
> > une erreur : "... Datareader est déja ouvert....."
> >
> > Je pense que c'est du à ma variable globale.
> >
> > Une idée pour gérer au mieux les objets connection dans un projets
> utilisant
> > plusieurs pages dans lesquelles sont lancées plusieurs requetes?
> > A noter que je travaille toujours sur la meme base de données sur le
> serveur
> > SQL .
> >
> > Merci pour vos réponses
> >
> >
>
>




--
Paul Bacelar
Avatar
bnob
ok alors si j'ai 4 boutons avec 4 event click qui utilise pour chaque event
une connection, je crée 4 SqlConnection objet, une dans chaque event

Et emsuite je les ferme lorsque je n'en ai plus besoin


"Paul Bacelar" a écrit dans le message
de news:
"bnob" wrote in message
news:
> Ou créer la connection dans la page, au moment de l'event on_load et où
> fermer la connection (dans quel event) ?

Vous créez la connexion le plus tard possible. Dans le on_load, c'est trop
tôt à mon goût car vous pouvez ne pas avoir besoin de récupérer de nouveau
les données pour cette nouvelle requête HTTP.


>
> Si on la crée dans l'event on_load de la page, comment l'utiliser dans


par
> exemple un event click d'un bouton ?
>

C'est une démonstration du fait de vous connecter le plus tard possible


car,
dans un event click, il est probable qu'il est plus pertinent d'utilisé un
DataSet qui sert de cache que de régénérer celui-ci (à moins que cela soit
un click sur un bouton refresh ;-) ). Si vous avez besoin de récupérer ces
données pour pouvoir les utiliser, le plus important c'est ces données et
pas la connexion que vous fermer dès que les données ont été récupérées.

Donc la propagation d'un objet connexion n'a pas d'intérêt, c'est la
propagation des données qui est importants.


> "Paul Bacelar" a écrit dans le


message
> de news:
> > Le plus simple et le plus performant est de maintenir la connexion le
> moins
> > de temps possible pour permettre un meilleur partages des connexions à
la
> > base vie le connexion pooling.
> >
> > Donc, pas de variable locale et création et fermeture de la connexion
dans
> > chaque page.
> >
> > Le connexion pooling, c'est magique ;)
> > --
> > Paul Bacelar
> >
> >
> > "bnob" wrote in message
> > news:
> > > Dans mon ASP.net projet j'ai un grand nombre de connection à un SQL
> Server
> > > Database. J'utilise une variabe globale pour ma connection que je
> déclare
> > > dans un module(VB.Net code behind). J'ouvre ma connection dans ma
> default
> > > page
> > >
> > > Tout est ok mais quand je démarre depuis ma default page une page


qui
> met
> > 30
> > > secondes pour s'afficher du à une requte assez long, et que pendant
ces
> 30
> > > secondes, un autre user ouvre une autre page depuis la default page,
> j'ai
> > > une erreur : "... Datareader est déja ouvert....."
> > >
> > > Je pense que c'est du à ma variable globale.
> > >
> > > Une idée pour gérer au mieux les objets connection dans un projets
> > utilisant
> > > plusieurs pages dans lesquelles sont lancées plusieurs requetes?
> > > A noter que je travaille toujours sur la meme base de données sur le
> > serveur
> > > SQL .
> > >
> > > Merci pour vos réponses
> > >
> > >
> >
> >
>
>
--
Paul Bacelar




Avatar
Paul Bacelar
En ASP.NET, ta page est recrée à chaque requête et c'est la magie du
ViewState qui donne l'impression que ton objet page persiste, mais ce n'est
pas le cas.

En pratique, si tu crées une connexion dans un gestionnaire d'évènement de
clic bouton et puis dans une autre dans un autre gestionnaire de clic, et
bien il n'y aura jamais deux connections en même temps, car pour cela il
faudrait passer dans les 2 gestionnaires en une requête.

En clair tu crées la connexion juste avant de l'utilisé et la ferme juste
après ne plus en avoir besoin dans le traitement de la requête HTTP, donc,
en gros, avant la fin de ton gestionnaire d'événement.

Pour ton exemple, il y aura dans chacun de tes gestionnaires, la création et
la fermeture d'une connexion.

D'un point de vue de ton application, tu n'ouvrira qu'une connexion par
requête HTTP car il n'y aura exécution que d'un seul gestionnaire.

D'un point de vue de la base de donnés, il n'y aura pas un de luge
d'ouverture ou de fermeture de connections car le pool de connexion
d'ASP.NET va maintenir la connexion réseau à la base tant qu'un utilisateur
utilisera souvent la même chaîne de connexion (et oui, la connexion
sous-jacente, que ton application utilise, sera partagée par plusieurs
utilisateurs de ton application, voir utilisée par d'autres application, si
la chaîne de connexion est la même, voilà le secret de la monté en charge du
polling de connexion ;-) )

Du point de vue du programmeur, c'est méga-simple, on crées la connexion
juste avant de s'en servir et on la ferme juste après.
--
Paul Bacelar


"bnob" wrote in message
news:OWkv2$
ok alors si j'ai 4 boutons avec 4 event click qui utilise pour chaque


event
une connection, je crée 4 SqlConnection objet, une dans chaque event

Et emsuite je les ferme lorsque je n'en ai plus besoin


"Paul Bacelar" a écrit dans le message
de news:
> "bnob" wrote in message
> news:
> > Ou créer la connection dans la page, au moment de l'event on_load et



> > fermer la connection (dans quel event) ?
>
> Vous créez la connexion le plus tard possible. Dans le on_load, c'est


trop
> tôt à mon goût car vous pouvez ne pas avoir besoin de récupérer de


nouveau
> les données pour cette nouvelle requête HTTP.
>
>
> >
> > Si on la crée dans l'event on_load de la page, comment l'utiliser dans
par
> > exemple un event click d'un bouton ?
> >
>
> C'est une démonstration du fait de vous connecter le plus tard possible
car,
> dans un event click, il est probable qu'il est plus pertinent d'utilisé


un
> DataSet qui sert de cache que de régénérer celui-ci (à moins que cela


soit
> un click sur un bouton refresh ;-) ). Si vous avez besoin de récupérer


ces
> données pour pouvoir les utiliser, le plus important c'est ces données


et
> pas la connexion que vous fermer dès que les données ont été récupérées.
>
> Donc la propagation d'un objet connexion n'a pas d'intérêt, c'est la
> propagation des données qui est importants.
>
>
> > "Paul Bacelar" a écrit dans le
message
> > de news:
> > > Le plus simple et le plus performant est de maintenir la connexion


le
> > moins
> > > de temps possible pour permettre un meilleur partages des connexions


à
> la
> > > base vie le connexion pooling.
> > >
> > > Donc, pas de variable locale et création et fermeture de la


connexion
> dans
> > > chaque page.
> > >
> > > Le connexion pooling, c'est magique ;)
> > > --
> > > Paul Bacelar
> > >
> > >
> > > "bnob" wrote in message
> > > news:
> > > > Dans mon ASP.net projet j'ai un grand nombre de connection à un


SQL
> > Server
> > > > Database. J'utilise une variabe globale pour ma connection que je
> > déclare
> > > > dans un module(VB.Net code behind). J'ouvre ma connection dans ma
> > default
> > > > page
> > > >
> > > > Tout est ok mais quand je démarre depuis ma default page une page
qui
> > met
> > > 30
> > > > secondes pour s'afficher du à une requte assez long, et que


pendant
> ces
> > 30
> > > > secondes, un autre user ouvre une autre page depuis la default


page,
> > j'ai
> > > > une erreur : "... Datareader est déja ouvert....."
> > > >
> > > > Je pense que c'est du à ma variable globale.
> > > >
> > > > Une idée pour gérer au mieux les objets connection dans un projets
> > > utilisant
> > > > plusieurs pages dans lesquelles sont lancées plusieurs requetes?
> > > > A noter que je travaille toujours sur la meme base de données sur


le
> > > serveur
> > > > SQL .
> > > >
> > > > Merci pour vos réponses
> > > >
> > > >
> > >
> > >
> >
> >
> --
> Paul Bacelar
>
>