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 :

Database et Multithreads


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut Database et Multithreads
    bonjour à tous,

    Je souhaiterais développer une application qui extrait des emails depuis Exchange et les insère les informations dans une base de données, mais avant de me lancer, je souhaiterais eclaircir quelques points...

    pouvez vous m'aider ou me conseiller quand à la façon de développer l'application, sachant qu'il y aura un client windows (console d'administration), et un service WCF (service d'extraction des emails).

    La ou je bloque un peu, c'est sur la gestion des connexions SQL. Sachant que je souhaite utiliser postgreSQL, je ne sais pas trop si je dois ouvrir une connexion pour chaque thread, ou utiliser une connexion pour l'ensemble des threads, sachant que je souhaite utiliser les transactions (TransactionScope)....

    De plus, j'ai regardé un peu la doc de postgreSQL et j'ai un peu de mal avec les paramètres "max_connexions" et "max_prepared_transactions"...

    Encore merci pour vos conseils.

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Sans plus d'informations (et ça tombe bien, on frise la limite de mes connaissances ) je dirais les généralités suivantes :
    - .NET et son GC font automatiquement du pooling et de la réutilisation de connexions
    - La plupart du temps, les connecteurs de base de données supportent aussi des mécanismes automatisés de pooling (vérifier avec PostgreSQL, mais je suis presque certain que c'est le cas)

    Ainsi :
    - Lorsqu'une méthode de n'importe quel thread Close() une connexion (même explicitement) et libère la ressource Dispose() (même explicitement) la connexion est récupérée par le GC et remise en pool sans forcément être fermée ni terminée.
    - Lorsqu'une méthode de n'importe quel thread Open() une connexion, si elle comporte la même chaîne de connexion qu'une connection en pool (même base, même utilisateur, même paramètres) alors celle du pool est réutilisée.

    Par conséquent :
    - Multithread ou non, il faut systématiquement utiliser using() sur tous les objets de bdd (connexion, transaction, command notamment)
    - Il faut systématiquement Open() et Close() immédiatement avant et après utilisation (bon, évidement, si t'as 4 requêtes à faire à la suite, tu fermes pas la connexion entre les requêtes...)
    - Lors de l'ouverture d'une nouvelle connexion, le CG peut décider de réutiliser une autre connexion déjà ouverte et en cours d'utilisation par un autre thread. Il cloisonne alors les deux traitements dans des transactions séparées.

    Au niveau des transactions, il faut savoir :
    - Que lorsque tu fais un Close() (même si la connexion reste ouverte et remise en pool) un Rollback est fait sur toutes les transaction en cours
    - Qu'une transaction ouverte peut potentiellement générer les LOCKS dans la base, d'où l'intéret de conserver les objets ouverts le moins longtemps possible

    Après, on a parfois besoin de gérer des locks "manuellement", et là on est obligé de conserver des connexions et transactions ouvertes pendant longtemps. Mais ça doit se faire sciemment, et à bon escient.
    Exemple : http://www.developpez.net/forums/d11...rrous-rowlock/

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Merci StringBuilder; ça commence à devenir un peu plus claire dans ma tête...

    J'ai commencé un peu cet après midi, et comme ut le mentionnes

    Que lorsque tu fais un Close() (même si la connexion reste ouverte et remise en pool) un Rollback est fait sur toutes les transaction en cours
    J'utilise bien le using avec TransactionScope, puis le Complete une fois la transaction terminée (ou le close en cas de problème et donc, le rollback). J'ai rajouté le Dispose, même si c'est explicite.

    Par contre, j'ai pas pensé à utiliser le using pour les commandes (et j'en ai pas mal d'ailleurs.... Est-ce que tu as un exemple d'utilisation de plusieurs commandes avec un using s'il te plait ?

    Je suis en train de me renseigner sur la façon dont PostgreSQL fonctionne et sur ses paramètres de connexions et de pooling (c'est possible avec PostgreSQL, mais désactivé par défaut avec le paramètre max_prepared_transactions qui est à 0, si j'ai bien tout compris )...

    Encore merci pour ton aide !

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Bah le using sur un command n'est pas compliqué, je ne vois pas trop la question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    using (SqlCommand cmd = cnx.CreateCommand())
    {
        [...]
    }
    Et quand tu as besoin de faire plusieurs requêtes à la suite, utilise au maximum le même command.
    N'oublie pas de faire un cmd.Parameters.Clear() à chaque fois pour vider les paramètres (à moins qu'ils ne soient identiques d'une requête à l'autre).

    Par contre, tu parles de TransactionScope, et ça, je n'ai aucune idée de ce que c'est, donc je peux pas du tout te conseiller là dessus...

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Après avoir regardé rapidement la doc de C#, j'ai compris ce qu'était le transaction scope.

    As-tu vraiment besoin de cette fonctionnalité ?

    Il s'agit de transactions en dehors du SGBD. Cela implique donc que :
    - Ca crée une transaction dans le SGBD
    - MAIS AUSSI dans ton programme. C'est à dire que si tu annules la transaction tu rollback dans la base, mais aussi tout ce que ton programme à fait (modification de variables, de fichiers,etc.) Ca me semble un peu lourd si ce n'est pas pour gérer des cas très précis.

    Je pense que tu dois pouvoir te contenter des transactions du SGBD, à savoir l'objet SqlTransaction (ou PgTransaction, je ne sais pas comment sont préfixées les classes pour Posgresql)

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Il s'agit de transactions en dehors du SGBD. Cela implique donc que :
    - Ca crée une transaction dans le SGBD
    - MAIS AUSSI dans ton programme. C'est à dire que si tu annules la transaction tu rollback dans la base, mais aussi tout ce que ton programme à fait (modification de variables, de fichiers,etc.) Ca me semble un peu lourd si ce n'est pas pour gérer des cas très précis.
    Euh je pense pas, pour moi l'avantage du TransactionScoope c'est que tu peux imbriquer des transactions

    Exemple tu as une Methode1 qui fait appelle à une transaction et une Méthode2 qui fait appelle aussi a une transaction
    Après tu as une Methode3 qui commence une transaction et qui appelle Methode1 et Methode2 et qui commit la transaction

    Sans transaction scope la Methode 1 et 2 auraient toute deux sauvés les modifications alors que Methode3 fait un rollback

Discussions similaires

  1. Redhat-9 changer le path des databases
    Par jean christophe dans le forum Installation
    Réponses: 7
    Dernier message: 30/05/2003, 17h53
  2. [BDE] Ou peut-on telecharger le Borland Database Engine?
    Par Robert A. dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 27/05/2003, 10h01
  3. Blob (interbase) d'une Database à l'autre
    Par TOM-Z dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/05/2003, 21h57
  4. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36
  5. Tutoriels et liens pour le Borland Database Engine
    Par Community Management dans le forum Paradox
    Réponses: 0
    Dernier message: 25/03/2002, 10h23

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