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

MS SQL Server Discussion :

[ADO] Bonnes pratiques de l'asynchrone


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 55
    Points : 41
    Points
    41
    Par défaut [ADO] Bonnes pratiques de l'asynchrone
    Bonjour,

    J'ai une application VB6, tournant sur mon serveur, qui doit être de disponibilité maximale, mais qui exécute parfois certaines requètes longues.

    Ces requêtes (UPDATE...SET) ne sont pas urgentes, donc j'ai pensé à les exécuter avec l'option adAsyncExecute afin que la main soit rendue à l'application VB immédiatement et laisser SQL Server se débrouiller avec.

    Or je constate:
    - que je ne peux pas en lancer plusieurs de suite sur la même connexion
    - que je ne peux fermer la connexion de suite
    Dans ces deux cas j'obtiens l'erreur 3711 "Operation cannot be performed while executing asynchronously."

    Je peux mettre une boucle de DoEvents derrière en attendant la fin de la requète mais je trouve ça lourd. Vu le nb potentiel de requêtes lancées, je risque de me retrouver avec une imbrication de DoEvents conséquente et VB ne va pas aimer.

    Une autre solution consiste à ne pas fermer la connexion, en se disant que l'objet se détruira bien tout seul en mémoire lorsque la requête sera terminée, mais on m'a appris que ce n'était pas du tout une bonne pratique en raison de fuites de mémoire potentielles.

    Donc:
    - existe-il mieux à faire ?
    - ou y a t-il une fonctionnalité dans SQL Server pour parvenir au même résultat ?

    Pour info voici une exemple de la procédure actuelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub AsyncUpdate()
     
    Dim tmpconn As New ADODB.Connection
    tmpconn.Open "Provider=SQLNCLI;Integrated Security=SSPI;Database=MyBaseSQL;DataTypeCompatibility=80;Server=(local)"
     
    tmpconn.Execute "UPDATE MaTable SET MonChamp=0 WHERE MonCritère=1" , , adAsyncExecute Or adExecuteNoRecords Or adCmdText
     
    ' ici on ne mets pas le tmpconn.Close
     
    End Sub
    Merci!

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Personne ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    tu as la solution d'executer la requete dans un thread (comme les FTP qui transferent plusieurs fichiers a la fois) ou sinon dans ton cas c'est de faire croire au serveur que c'est lui qui travaille.
    il te faut donc créer un job en dynamique puis le lancer=> ton appli attendra simplement le retour du serveur comme quoi le job a été LANCE et non la fin de l'execution.

    si tu veux un exemple demandes..

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Merci. Je veux bien un exemple pour le job.
    Quand je dis que ce n'est pas urgent, il est quand même souhaitable que la requete soit exécutée dans les 10 secondes. Cela va t-il être possible avec les jobs ?
    Par ailleurs, pour info il y a en moyenne 2 requêtes de ce type exécutées par seconde.

Discussions similaires

  1. Bonnes pratiques de protections individuelles
    Par Community Management dans le forum Sécurité
    Réponses: 23
    Dernier message: 11/06/2024, 11h23
  2. Réponses: 7
    Dernier message: 02/11/2005, 15h30
  3. [Bonne pratique]Stratégie d'allocation
    Par jowo dans le forum C
    Réponses: 1
    Dernier message: 05/10/2005, 14h47
  4. [FOREIGN K] Valeur de champ = nom de table. Bonne pratique ?
    Par Seb des Monts dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/05/2005, 10h56

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