IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

Classe SQL Générique : Garder Connexion à une DB ?


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut Classe SQL Générique : Garder Connexion à une DB ?
    Bonjour,

    Des articles existent déjà, mais je ne trouve pas la réponse qui concerne mon cas.

    J'ai une classe SQL Générique, qui permet de se connecter, d'effectuer des requête et d'en obtenir un résultat, quelle que soit la DB derrière (MySQL, Oracle, SQL Server, etc.).

    J'utilise cette classe à la fois pour des applications Windows Form et à la fois pour des applications Web - ASP.NET.

    J'aimerais qu'elle soit vraiment utilisée de la même manière, implémentée de la même manière sans devoir la changer.

    Ma question :
    Devrais-je garder une connexion ouverte à la base de données et la fermer sur commande dans l'application ?
    Ou devrais-je ouvrir la connexion à chaque requête ExecuteQuery, NonQuery, Scalar, et la refermer à la fin de la requête, automatiquement ?

    C'est un dilemne dans lequel je me trouve, et je ne sais pas quoi choisir.

    Dans un premier cas, celui de garder la connexion ouverte, on aurait donc :
    1) Instanciation de l'objet.
    2) Initialisation des variables + Connexion (à la demande).
    3) Exécution de requête.
    (...)
    7) Exécution de requête.
    8) Fermeture Connexion.
    (...)
    x) Destruction de l'objet.

    Dans un second cas, pour ouvrir une connexion automatiquement à la demande d'exécution de requête, nous aurions :
    1) Instanciation de l'objet.
    2) Execution de requête (Avec Initialisation des variables + Connexion + Execution de la requête + Fermeture de connexion).
    3) Execution de requête (Avec Initialisation des variables + Connexion + Execution de la requête + Fermeture de connexion).
    (...)
    x) Destruction de l'objet.


    Je suis conscient que d'ouvrir et fermer une connexion à chaque requête nécéssite beaucoup de ressources CPU.

    Mais garder une connexion ouverte à une DB n'est pas gourmand justement pour cette DB et l'acceptation du nombre de connexion max ? Ou du support du nombre d'utilisateurs connectés ?


    J'aimerais avoir votre avis sur la chose, pour terminer de créer ma classe.

    Merci d'avance.

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Le composant que j'utilise, ODP (pour Oracle), propose par défaut du pooling : la suppression / la fermeture d'un objet OracleConnection ne ferme pas la connexion physique tout de suite, et tous les tutoriels proposés ouvrent une OracleConnection à chaque requête (qui en fait demandent au pool une connexion physique).

    Après, je sais pas dans quelle mesure c'est spécifique à Oracle ou à ODP.
    ಠ_ಠ

  3. #3
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par Guulh Voir le message

    Après, je sais pas dans quelle mesure c'est spécifique à Oracle ou à ODP.
    Voilà une remarque qui mérite d'être soulignée.

    Cela me donne l'impression qu'il n'y a pas de "mieux" ou de "moins bien" dans le cas des connexion / déconnexion à une DB.

    Pour ma classe générique, je ne sais vraiment pas comment faire.

  4. #4
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Excellente question! J'allais justement la poser.
    Ce que je voudrais bien savoir en plus c'est combien une seule connexion peut-elle gérer de requêtes à la seconde?
    Un serveur SQL se met HS légèrement au-dessus 3900 connections/s. Si on utilise une seule connexion (grâce au singleton: ex1, ex2) pour une application, sera-t-elle capable de supporter un traffic élevé?

    Déjà, dans le cas d'un singleton, sera-ce le même objet pour tous les visiteurs ou bien le même objet pour toutes les requêtes dans le court de l'execution d'un script par UN internaute?

    Euh, j'chuis clair??

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Points : 106
    Points
    106
    Par défaut
    Dans ce cas, je pense vraiment que ce sera un objet par utilisateur.

    Je n'en suis cependant pas certain.

    Mais j'apparenterais ça plus à une "variable de session" qu'un objet static, non ?

    Mais oui, la question persiste ...


    Edit :
    Note que dans ton cas, un peu remarquer, les singleton : -> Static.
    Donc je ne sais pas ...

  6. #6
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Et bien le test a été fait et cela correspond à une variable d'application, commune à tous les utilisateurs du site.

    Une connection gérée par un pattern singleton est equivalent à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Application.Lock
    Set Application("Connexion") = Server.CreateObject("ADODB.Connection")
    Application.Unlock
    Donc la question : une seule connexion peut-elle supporter les requêtes émises par tous les visiteurs d'un site Internet?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Les providers Oracle et SQL Server font du connection pooling. C'est la meilleure approche, vu que les connexions ne sont pas fermées et réouvertes perpétuellement.
    Pour une approche générique du provider, j'ai un article qui en parle .
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Avoir une seule connexion et les dataReader
    Moi je me poserai également la connexion du DataReader ?

    Que se passe t'il si deux clients différents essayent d'ouvrir un DataReader sur la même connexion ?

    De la même manière que on ne peut pas en code manipuler deux readers issues de la même connexion je ne pense pas que deux clients web pourront faire ce genre de manipulations.

    J'ai donc exactement le même problème sur les reader ET les transactions, mySQL ne les gérant pas (j'utilise le DADB d'enterprise library 3.1 pour faire une connexion générique à la base de donnée)

Discussions similaires

  1. Garder connexion dans une autre classe
    Par oOmanOo dans le forum Général Java
    Réponses: 1
    Dernier message: 16/05/2011, 10h49
  2. Réponses: 10
    Dernier message: 23/09/2007, 17h33
  3. probleme de connexion à une base sql avec mot de passe
    Par cari dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 16/12/2005, 10h16
  4. Erreur de connexion à une BDD SQL Server 2000 avec BDE
    Par SchpatziBreizh dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2005, 11h22
  5. Réponses: 3
    Dernier message: 29/03/2004, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo