Je suis du développement d'une application avec SQLite comme base de données, et j'ai un peu de mal à comprendre comment l'utiliser dans plusieurs threads (aucun des autres Débordement de Pile questions m'a vraiment aidé, malheureusement).
Mon cas d'utilisation: La base de données a une table, appelons-la "Une", qui a différents groupes de lignes (basé sur l'une de leurs colonnes). J'ai le "fil conducteur" de l'application qui lit le contenu de la table A. En outre, je décide, une fois dans un certain temps, de mettre à jour un certain groupe de lignes. Pour ce faire, je veux lancer un nouveau thread, supprimer toutes les lignes du groupe, et insérez-la à nouveau (c'est la seule façon de le faire dans le cadre de mon application). Cela peut se produire à différents groupes dans le même temps, j'ai 2+ threads essayer de mettre à jour la base de données.
Je suis à l'aide de différentes transactions de chaque thread, I. E. au début de chaque thread du cycle de mise à jour, j'ai commencer. En fait, ce que chaque thread ne fait appeler "COMMENCER", supprimer de la base de données de toutes les lignes qu'il doit "mettre à jour", et les insère à nouveau avec les nouvelles valeurs (ce qui est la façon dont il doit être fait dans le contexte de ma demande).
Maintenant, j'essaie de comprendre comment je vais sur la mise en œuvre de cette. J'ai essayé de lecture autour (d'autres réponses sur Stack Overflow, l'SQLite site), mais je n'ai pas trouvé toutes les réponses. Voici quelques choses que je me demandais:
- Dois-je appeler à "ouvrir" et créer un nouveau sqlite structure de chaque thread?
- Dois-je besoin d'ajouter un code spécial pour tout cela, ou est-ce suffisant pour frayer les différents threads, mettre à jour les lignes, et c'est très bien (depuis que je suis en utilisant différentes transactions)?
- J'ai vu quelque chose de parler des différents types de verrou il y a, et le fait que je pourrais recevoir "SQLite occupé" à partir de l'appel de certaines Api, mais honnêtement, je ne vois pas de référence qui a complètement expliqué quand j'ai besoin de prendre tout cela en compte. Dois-je?
Si quelqu'un peut répondre aux questions/me pointer dans la direction d'une bonne ressource, je lui en serais très reconnaissant.
Mise à JOUR 1: De tout ce que j'ai lu jusqu'à présent, il semble que vous ne pouvez pas avoir les deux fils qui vont écrire dans un fichier de base de données, de toute façon.
Voir: http://www.sqlite.org/lockingv3.html. Dans la section 3.0: UNE RÉSERVÉE verrou signifie que le processus de planification sur l'écriture pour le fichier de base de données à un certain moment dans l'avenir, mais qu'il est actuellement, il suffit de lire à partir du fichier. Un seul RÉSERVÉS serrure peut être active à la fois, même si plusieurs verrous PARTAGÉS peuvent coexister avec un seul RÉSERVÉS serrure.
Est-ce à dire que je peux aussi bien que spawn hors un seul thread à la mise à jour d'un groupe de lignes à chaque fois? I. e., avoir une sorte de poller thread qui décide que j'ai besoin de mettre à jour certaines des lignes, puis crée un nouveau thread pour le faire, mais jamais plus d'un à la fois? Depuis, il ressemble à n'importe quelle autre thread, j'ai créer ne SQLITE_BUSY jusqu'à ce que le premier thread de finitions, de toute façon.
Ai-je bien compris les choses correctement?
BTW, merci pour les réponses jusqu'à présent, ils ont aidé beaucoup.