VBA: Problème Lecture/Ecriture en simultané sur Access

VBA: Problème Lecture/Ecriture en simultané sur Access - VB/VBA/VBS - Programmation

Marsh Posté le 22-02-2013 à 10:16:44    

:hello:  
Encore un petit truc chiant à résoudre :o
 
J'ai une base de donnée que je met à jour depuis un l'ordinateur 1.
La bdd se trouve sur le server
Les MàJ de la bdd se font à intervalles réguliers de temps
La MàJ est commandée depuis Excel et se fait en VBA
 
J'ai N<5 autres ordinateurs connectés au Server et qui ont besoin, de temps en temps, d'extraire des données de cette base de données.
Le code d'extraction à été fait en c#, compilé en librairie intégrée à Excel (cette partie à été faite par un développeur)
 
J'ai codé le code pour les update, ça marche plutôt bien, durée de l'update: 1 seconde max (je log le début et la fin de la procédure, environs 3k lignes updatées
 
Problème: si un des N ordinateurs interroge la bdd au moment où ordinateur 1 update la bdd, l'extraction est très lente, et l'update, qui d'habitude prends 1 seconde freez et met entre 14 et 32 secondes (durée observées :o)
 
Au début, ma macro d'update vidait la bdd puis la remplissait. Je me suis dit que ça venait peut être de là, du coup, je l'ai changée et au lieu de vider/écrire, je passe par une requête Update
Même combat.
 
Est ce que quelqu'un aurait une idée?
La seule que je voit pour le moment, et que je vais tester est d'avoir 2 bdds... bdd1 est updatée, bdd2 est lue, à la fin de chaque update, ma macro sauve bdd1 en bdd2
 
Je me dis qu'en cas de conflit (lecture de bdd2 au moment de la sauvegarde de bdd1 en bdd2), je ferais ignorer l'erreur (vba ne pourra pas sauver sous bdd2 vu que bdd2 est utilisé ailleurs), l'update ne se fait donc pas et on attendra le prochain, ceci n'est pas génant en soit vu que les updates sont assez réguliers.
Si vous avez d'autres idées, je suis preneur
Merci

Reply

Marsh Posté le 22-02-2013 à 10:16:44   

Reply

Marsh Posté le 22-02-2013 à 10:44:42    

 
           Salut !   Y a moyen de verrouiller l'accès de la bdd pendant sa màj  ?
 
           Comme pour l'instruction Open avec l'option Lock …

Reply

Marsh Posté le 22-02-2013 à 11:01:00    

Je n'avais pas considéré cet aspect (que je ne connaissais pas d'ailleurs :o)
J'ai regardé dans l'aide et j'ai trouvé ça:
http://msdn.microsoft.com/en-us/li [...] 12%29.aspx
C'est la méthode que j'utilise pour ouvrir la bdd avant l'update,
J'ai ajouté l'option true (false par défaut) qui fait que l'ouverture se fait en mode, du coup, le vba d'upsate ouvre la bdd en:

Citation :

Opens the database in exclusive mode.


C'est de ça qu'il s'agit?
J'ai essayé, aucun changement :/
ça ralenti considérablement si je lis en même temps qu'il y update.
 
DU coup, j'ai regardé aussi du coté du code C++ (ce n'est pas du C# en fait), mais je n'y pige rien, je ne sais pas s'il y a l'équivalent en option d'ouverture pour la lecture...
 
Résultat: statut quo :o
Merci pour ta réponse en tout cas :)

Reply

Marsh Posté le 22-02-2013 à 11:31:28    

Je viens de tester la methode à 2 bdd, ça marche plutôt bien
J'ai mis un on error resume next au moment de la sauvegarde, ce qui me permet de zapper la sauvegarde en cas de lecture de la bdd au moment de la sauvegarde.
Je trouve que ce n'est pas optimum, même si les bdd ont une taille figée et modérée, ça reste 2 fichiers, je ne trouve pas ça super propre, mais faute de mieux...

Reply

Marsh Posté le 22-02-2013 à 13:03:36    

 
           Autre solution : un fichier " drapeau " :  dans le répertoire de la bdd, s'il y a par un exemple un fichier maj.dat ,
                                                                     pas d'accès pour l'utilisateur lambda + message " MàJ en cours " …
                                                                     Une fois la mise à jour accomplie, le fichier est renommé par exemple en maj.da$
 
           C'est du bricolo mais simple à mettre en oeuvre …
 

Reply

Marsh Posté le 22-02-2013 à 13:12:26    

 
           Jettes un œil sur http://connectionstrings.com/access, on ne sait jamais …
 

Reply

Marsh Posté le 22-02-2013 à 13:32:30    

Marc L a écrit :

 
           Autre solution : un fichier " drapeau " :  dans le répertoire de la bdd, s'il y a par un exemple un fichier maj.dat ,
                                                                     pas d'accès pour l'utilisateur lambda + message " MàJ en cours " …
                                                                     Une fois la mise à jour accomplie, le fichier est renommé par exemple en maj.da$
 
           C'est du bricolo mais simple à mettre en oeuvre …
 


Bonne idée :)
J'essairai à l'occasion, là, je n'ai pas trop la main sur la macro d'execution de l'update,
Et surtout, mes premiers tests en méthode 2 bases semble fonctionner, mais je te l'accorde, flagger l'update évite de manipuler des fichiers à 5mo (taille de ma bdd)  et même si c'est du bricolage, ça me semble un peu mieux que gérer 2 fichiers.

Marc L a écrit :

 
           Jettes un œil sur http://connectionstrings.com/access, on ne sait jamais …
 


J'ai regardé en diagonale, rien de nouveau sous le soleil, surtout que je n'utilise pas les mêmes librairies...
Merci pour le lien, je le garde sous le coude!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed