Est-il acceptable de garder une connexion à la base de données ouverte pendant toute la vie de la page?

StackOverflow https://stackoverflow.com/questions/302149

Question

Tout le monde sait que vous devez fermer une connexion immédiatement après l'avoir utilisée.

En raison d'une faille dans la conception du modèle d'objet de mon domaine, j'ai dû laisser la connexion ouverte pendant tout le cycle de vie de la page. Pour l’essentiel, j’ai une propriété Just In Time qui ouvre une connexion lors du premier appel, puis sous Page.Unload (..), elle vérifie si une connexion à une base de données a déjà été ouverte, puis la ferme si elle l’est. Comme cela ne prend qu’une seconde, j’ai eu l’avis que ce n’était pas très différent de le fermer immédiatement.

Est-ce que ça va? Ou devrait-il toujours être fermé immédiatement après chaque utilisation?

Merci d'avance.

Était-ce utile?

La solution

Ce n'est pas idéal, mais je ne réécrirais pas ma demande par dessus. À moins que votre page ne prenne beaucoup de temps en utilisant différentes méthodes, le cycle de vie complet de la page doit s'exécuter rapidement. En pratique, cela peut simplement signifier que votre objet de connexion est ouvert quelques millisecondes de plus qu'il ne l'aurait été autrement. Cela peut être important dans certains scénarios, mais cela ne semble pas être le cas dans votre cas.

Autres conseils

Non, ce n'est pas OK.

Si votre application doit au besoin évoluer ou évoluer, vous voudrez résoudre ce problème. En maintenant cette connexion ouverte, vous réduisez votre capacité à évoluer. N'oubliez pas que les connexions ouvertes consomment de la mémoire sur le serveur, du client, des verrous ouverts, etc.

Et si votre page se bloquait avant d’atteindre l’événement Page.Unload? Vous aurez une connexion ouverte. Pour moi, il est préférable de toujours fermer la connexion le plus rapidement possible.

Oui, ça va.

Fermer la connexion dès que vous le pouvez est une bonne pratique pour empêcher les connexions ouvertes orphelines, mais si vous êtes sûr que la connexion est en train de se fermer, rien ne se passe mal avec ça.

Chaque application ASP.NET décente utilise le regroupement de connexions de nos jours et un pool est fondamentalement un ensemble de connexions ouvertes. Dans votre cas, cela voudrait dire que le lien que vous conservez est "occupé". et ne peut pas être utilisé pour servir d'autres demandes.

Pour autant que je sache, il s'agirait d'un problème d'évolutivité en fonction du temps nécessaire au rendu / à la page de votre page. Si vous vous attendez à seulement 100 utilisateurs, comme vous dites, ce n'est probablement pas un problème - à moins que ce ne soit 100 req / sec bien sûr.

Du point de vue technologique, tout va bien. Autant que je me souvienne, la plupart des applications client-serveur (Web et non Web), y compris le code ASP classique utilisé pour fonctionner ainsi, par exemple, vous déclarez une connexion pour la page entière et travaillez avec elle.

page se bloque? c'est ce que l'utilisation et enfin sont pour

Cela dit, pour des raisons de performances de la base de données (mise à l'échelle) *, il est préférable de laisser les connexions ouvertes aussi rapidement que possible, en ne laissant que l'ouverture que vous voulez.

* Au début de ma carrière, un mentor m'a dit cela. Je dois dire que je n'ai pas testé cela moi-même, mais ça sonne bien, théoriquement

Bien sûr, vous pouvez les garder ouverts, mais non, non. Fermez-le après utilisation dans finalement des blocs. Un compromis équitable entre "après chaque utilisation" et est de le fermer après chaque bloc d'utilisation, si vous êtes capable d'exécuter un proc stocké, de mettre à jour une colonne, puis de supprimer une autre ligne, vous pouvez ouvrir / fermer autour de ces trois opérations, en supposant qu'elles soient toutes emballées dans un essai / catch / enfin.

Vous devez certainement garder la connexion ouverte pendant toute la durée de vie de la page, si vous effectuez plusieurs requêtes au cours de celle-ci. En règle générale, on réutilise des connexions sur plusieurs pages, en fait.

Je pense qu'une meilleure question avec des retours beaucoup plus informés et productifs consisterait peut-être en quelques extraits de ce que vous faites (code) et en expliquant les raisons pour lesquelles vous avez fait ce choix. Il existe probablement une meilleure solution qui n'exige pas de garder la connexion ouverte aussi longtemps, mais au moins, pour des raisons pragmatiques, vous pouvez obtenir des informations sur la pertinence d'une révision.

À l'avenir, vous souhaiterez certainement vous éloigner de l'accès aux données dans votre code-behind.

Je trouve pratique de garder la connexion ouverte lorsque vous utilisez ORM ( Ouvrir une session dans View ) de sorte qu'après une première extraction, d'autres données puissent être chargées paresseusement selon les besoins. Cela fonctionne bien lorsque les temps de réponse des pages sont raisonnables afin de ne pas nouer les connexions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top