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

SQLite Discussion :

SQLite et MultiThreading (via Wrapper C++)


Sujet :

SQLite

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut SQLite et MultiThreading (via Wrapper C++)
    Bonjour à tous,
    je poste ici un problème que je n'arrive pas à résoudre, malgré mes recherches et tentatives...

    Le contexte : je bosse sur une application C++ sous WinCE (donc domaine embarqué) ; qui utilise SQLite (version 3.6.11) à travers un wrapper C++. Une seule DB (qui contient 3 tables), DB stockée en local.
    Voici ce qui me pose problème : il y a deux threads concurrents, l'un accèdant à la DB uniquement en lecture, l'autre en écriture ou lecture.
    Le wrapper cité précédemment gère les accès concurrents via un mutex (les deux threads utilisent bien sûr la même instance d'objet Database) : chaque nouvel objet Query créé "locke" l'instance de Database (et la "unlocke" dans son destructeur). De fait, il ne peut y avoir en même temps deux instances de Query faisant référence à la même Database (j'ai vérifié tout cela avec des traces/assert ; tout est OK, la Database est bien "unlockée" après chaque Query...)
    Sauf qu'il arrive que des écritures ou des lectures échouent (erreur remontée par le moteur SQLite : "database is locked" / SQLITE_BUSY)

    Par rapport aux contraintes que j'ai, je ne peux me permettre de mémoriser l'ensemble des écritures à faire pour les faire par paquet au sein d'une seule transaction ; je dois donc les faire au fur et à mesure.

    La documentation officielle parle d'un flag de compilation (THREADSAFE=1) afin d'utiliser des mutex directement au niveau de la couche SQLite3. La définition de ce flag n'a pas résolu mon problème, j'ai toujours ces conflits. (En même temps, le wrapper gère normalement déjà l'exclusivité d'utilisation de la DB).
    Edit : après activation du flag, j'ai remplacé l'ouverture de la base de donnée sqlite3_open (fait dans Database::grabdb) par un sqlite3_open_v2 avec les flags (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX) ; mais sans succès...

    Vous aurez compris, je cherche à ne plus avoir d'erreur d'accès, mais là je suis un peu à cours d'idée
    L'un d'entre vous aurait il des suggestions svp ?
    (Si jamais je n'ai pas été très clair, dites le moi, je tenterai de réexpliquer plus clairement !)
    Merci d'avance et bon week-end,
    Aymerik

    ps : question annexe : à travers une appli de test reproduisant systématiquement le cas décrit ci-dessus, j'ai remarqué qu'après la fin des accès des threads à la DB (threads quittés), je vois le fichier journal apparaître/disparaître pendant plusieurs secondes (ou dizaines de secondes selon le temps d'éxécution des threads, donc selon le nombre de requêtes effectuées). Comment cela se fait il ? Y a t il une sorte de cache au niveau sqlite3 ?

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

    Informations forums :
    Inscription : Février 2005
    Messages : 94
    Par défaut
    Bonjour,

    Je viens de voir ça sur la doc officielle :

    But use caution: this locking mechanism might not work correctly if the database file is kept on an NFS filesystem. This is because fcntl() file locking is broken on many NFS implementations. You should avoid putting SQLite database files on NFS if multiple processes might try to access the file at the same time.
    http://www.sqlite.org/faq.html#q5

    C'est peut-être ton cas?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Salut Kentin,
    merci de ta réponse.
    J'ai suivi le lien que tu m'as donné, et le cas décrit n'est malheureusement pas mon cas : le système de fichier est de la FAT (plus précisément de la TexFAT).
    Je continue à chercher ; vous serez informés si je trouve quelque chose !
    Cordialement,
    Aymerik

  4. #4
    Membre confirmé Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Par défaut Peut être un autre lien ...
    salut, regarde là http://www.developpez.net/forums/d51...lite3_prepare/ cela ressemble à ton problême non ? donc de facto tu as peut être une réponse

  5. #5
    Membre confirmé Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 94
    Par défaut
    Sur ta base, tu as vérifié que le "PRAGMA locking_mode" est sur la valeur NORMAL?

    http://www.sqlite.org/pragma.html

Discussions similaires

  1. SQLite et multithread
    Par gilloddon dans le forum Android
    Réponses: 7
    Dernier message: 06/03/2013, 13h45
  2. [PDO] Sqlite via PDO + PHP5
    Par chatlumo dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/10/2008, 00h52
  3. Réponses: 4
    Dernier message: 07/03/2008, 09h40
  4. [SQLite] Update via PHP
    Par Blueangel3109 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/03/2008, 13h03
  5. connexion a une base sqlite via php
    Par guiguitte dans le forum SQLite
    Réponses: 4
    Dernier message: 11/07/2007, 11h31

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