Je fais de la programmation de base de données en utilisant Java avec SQLite.
J'ai constaté qu'une seule connexion à la fois à la base de données permettait l'écriture, alors que de nombreuses connexions disposaient simultanément d'une capacité de lecture.
Pourquoi l'architecture de SQLite a-t-elle été conçue comme ceci? Tant que les deux choses en cours d'écriture ne sont pas écrites au même endroit dans la base de données, pourquoi deux écritures ne peuvent-elles pas se produire en même temps?
database
concurrency
sqlite
Embout d'acier
la source
la source
Réponses:
Parce que "plusieurs écritures simultanées" est beaucoup, beaucoup plus difficile à accomplir dans le moteur de base de données de base qu'un simple écrivain, plusieurs lecteurs. Cela va au-delà des paramètres de conception de SQLite, et son inclusion risquerait de nuire à la taille et à la simplicité délicieuses de SQLite.
La prise en charge de niveaux élevés de concurrence d'accès en écriture est l'une des caractéristiques des moteurs de base de données volumineux tels que DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL et Sybase. Mais il est techniquement difficile à réaliser, nécessitant de nombreuses stratégies d'optimisation du contrôle de la concurrence, telles que le verrouillage de bases de données, de tables et de lignes, ou, dans les implémentations plus modernes, le contrôle de simultanéité multi-version . La recherche sur ce problème / besoin est volumineuse et remonte à plusieurs décennies .
SQLite a une philosophie de conception très différente de la plupart de ces SGBD centrés sur le serveur qui prennent en charge plusieurs rédacteurs. Il est conçu pour apporter la puissance de SQL et du modèle relationnel à des applications individuelles, et même pour pouvoir être intégré dans chaque application. Cet objectif nécessite des compromis importants. L'une de celles-ci consiste à ne pas ajouter l'infrastructure importante et les frais généraux nécessaires pour gérer plusieurs enregistreurs simultanés.
La philosophie peut être résumée par une déclaration sur la page des utilisations appropriées de SQLite :
la source
fopen()
, alors considérez toute la pilosité qui vient avec l’écriture simultanée dans un fichier texte.Parce qu’aucun serveur ne peut dire si des choses doivent être écrites au même endroit ou non. Il n'y a que deux processus essayant d'écrire dans un fichier.
Comme indiqué dans un commentaire, les écritures simultanées peuvent également être prises en charge par un thread interne. Je ne sais pas si cela fonctionnerait bien (je n'y ai pas beaucoup réfléchi non plus). Quoi qu'il en soit, voici pourquoi SQLite n'utilise pas de thread: Dr Hipp pense que les thread sont diaboliques.
Le fait que DR Hipp pense que les threads sont diaboliques est documenté dans la FAQ SQLite .
la source