Puis-je lire et écrire simultanément dans une base de données SQLite à partir de plusieurs connexions?

87

J'ai une base de données SQLite qui est utilisée par deux processus. Je me demande, avec la version la plus récente de SQLite, alors qu'un processus (connexion) démarre une transaction pour écrire dans la base de données, l'autre processus pourra-t-il lire simultanément à partir de la base de données?

sean717
la source
question connexe voir ici .. stackoverflow.com/questions/12117016/…
AndroidGeek

Réponses:

142

J'ai collecté des informations à partir de diverses sources, principalement sur sqlite.org, et les ai rassemblées:

Premièrement, par défaut, plusieurs processus peuvent avoir la même base de données SQLite ouverte en même temps, et plusieurs accès en lecture peuvent être satisfaits en parallèle.

En cas d'écriture, une seule écriture dans la base de données verrouille la base de données pendant une courte période, rien, même la lecture, ne peut accéder au fichier de la base de données.

À partir de la version 3.7.0, une nouvelle option «Write Ahead Logging» (WAL) est disponible, dans laquelle la lecture et l'écriture peuvent se dérouler simultanément.

Par défaut, WAL n'est pas activé. Pour activer WAL, reportez-vous à la documentation SQLite.

sean717
la source
Donc, hypothétiquement, si vous deviez résoudre un problème où vous vouliez des données localement sans les rendre accessibles au grand public mais la possibilité d'écrire plusieurs fichiers en parallèle, vous aurez besoin d'un fichier de base de données pour une telle écriture afin que plusieurs écritures puissent se produire simultanément. c'est ça? Je sais que plusieurs fichiers sont généralement désapprouvés, mais j'essaie de trouver un moyen de faire plusieurs écritures à partir d'une tâche de céleri sans utiliser une base de données côté serveur car j'ai besoin des données uniquement pour les calculs locaux
PirateApp
Il existe un pragma, verrouillage_mode = exclusif qui peut être utilisé pour verrouiller la base de données sur un seul processus, si vous souhaitez empêcher cette fonctionnalité.
Scovetta
20

SQLite3 autorise explicitement plusieurs connexions :

(5) Plusieurs applications ou plusieurs instances de la même application peuvent-elles accéder à un seul fichier de base de données en même temps?

Plusieurs processus peuvent avoir la même base de données ouverte en même temps. Plusieurs processus peuvent effectuer un SELECT en même temps. Cependant, un seul processus peut apporter des modifications à la base de données à tout moment.

Pour partager des connexions, utilisez le cache partagé SQLite3 :

À partir de la version 3.3.0, SQLite inclut un mode spécial «cache partagé» ( désactivé par défaut )

Dans la version 3.5.0, le mode de cache partagé a été modifié afin que le même cache puisse être partagé sur un processus entier plutôt que sur un seul thread.

5.0 Activation du mode de cache partagé

Le mode de cache partagé est activé pour chaque processus. À l'aide de l'interface C, l'API suivante peut être utilisée pour activer ou désactiver globalement le mode de cache partagé:

int sqlite3_enable_shared_cache (int);

Chaque appel sqlite3_enable_shared_cache () affecte les connexions de base de données suivantes créées à l'aide de sqlite3_open (), sqlite3_open16 () ou sqlite3_open_v2 (). Les connexions à la base de données qui existent déjà ne sont pas affectées. Chaque appel à sqlite3_enable_shared_cache () remplace tous les appels précédents dans le même processus.

Arun
la source