Je souhaite intégrer une base de données à l’un de nos produits et je me demande lequel serait le mieux adapté à nos besoins (déploiement automatique simple, absence d’administration, performances optimales), et sqlite semble être une bonne solution. Le problème est que la base de données peut potentiellement rencontrer des problèmes de simultanéité élevés: elle est accessible via PHP (Apache) chaque fois qu'un client se connecte au serveur sur lequel la base de données s'exécute. Un client se connecte (et exécute une requête INSERT) environ toutes les 10 secondes sur le serveur et plus de 100 clients peuvent éventuellement s'exécuter.
Lors de l'exécution d'une requête INSERT, sqlite verrouille toute la base de données à un moment donné pendant une durée déterminée. Existe-t-il un moyen de calculer cette durée? Si cela n’est pas possible, pensez-vous que sqlite (v3.3.7) est toujours adapté aux conditions ci-dessus?
Je ne pense pas que SQLite serait une bonne solution pour ces besoins. SQLite est conçu pour une utilisation locale et légère uniquement, pas pour traiter des centaines de demandes.
Je recommanderais une autre solution, par exemple MySQL
ou PostgreSQL
, les deux peuvent être scriptés assez bien. Donc, si j'étais vous, je mettrais mes efforts dans les scripts d'installation.
Pour éviter la guerre des flammes entre les croyants et les ennemis de SQLite, permettez-moi d'attirer votre attention sur le document SQLite When-To-Use souvent mentionné (je pense qu'il est considéré comme une source crédible). Ici, ils indiquent ce qui suit:
Situations dans lesquelles un SGBDR client/serveur peut mieux fonctionner
Concurrence élevée
SQLite prend en charge un nombre illimité de lecteurs simultanés, mais il ne permet qu'un seul rédacteur à tout moment. Pour de nombreuses situations, ce n'est pas un problème. Writer file d'attente. Chaque application fait fonctionner sa base de données rapidement et continue, et aucun verrou ne dure plus de quelques dizaines de millisecondes. Cependant, certaines applications nécessitent davantage de simultanéité et doivent peut-être rechercher une solution différente.
Je pense que dans la question posée implique de nombreuses écritures et si le PO opterait pour SQLite, il en résulterait une solution non évolutive.
J'essaie d'éviter les réponses émotives et l'hyperbole, mais je suis vraiment étonné du manque de connaissances sur le sqlite affiché sur cette page. Différentes implémentations de bases de données répondent à des besoins différents et des spécifications opérationnelles que vous fournissez, sqlite3 semble idéal pour vos besoins. Élaborer:
sqlite3 est entièrement conforme à ACID, ce qui signifie qu’il garantit des commits atomiques, ce que ni MySQL (si bon soit-il), ni Oracle ne peuvent se vanter. Voir plus ici
De plus, sqlite3 a un mécanisme simple pour assurer une concurrence maximale (qui est également sécurisée pour les threads), comme décrit dans leur document Verrouillage de fichier et document de concurrence .
Selon leur propre estimation (des développeurs sqlite3), sqlite3 peut atteindre jusqu'à 50 000 INSERT par seconde, un maximum théorique limité par la vitesse de rotation du disque. La conformité ACID nécessite que sqlite3 confirme qu’une validation de la base de données a été écrite sur le disque. Par conséquent, une transaction INSERT, UPDATE ou DELETE requiert deux rotations de disque complètes, ce qui réduit efficacement le nombre de transactions à 60/s sur un lecteur de disque à 7 200 tr/min. Ceci est décrit dans la sqlite FAQ liée dans une autre réponse et le fait donne une idée de la capacité de traitement des données du moteur en production. Mais qu'en est-il de la lecture et de l'écriture simultanées?
Le document Verrouillage de fichiers et document sur la concurrence, précédemment lié, explique comment sqlite3 évite le "démarrage de l'écrivain" - une condition selon laquelle un accès important en lecture à la base de données empêche un processus/thread cherchant à écrire dans la base de données d'acquérir un verrou. L'escalade de l'état de verrouillage de SHARED à PENDING à EXCLUSIVE se produit lorsque sqlite3 rencontre une instruction INSERT (ou UPDATE ou DELETE), puis de nouveau sur COMMIT, ce qui signifie que le verrouillage complet de la base de données est retardé jusqu'au dernier moment avant qu'une écriture réelle soit effectuée. Le résultat du mécanisme intelligent de gestion du verrouillage de fichier par sqlite signifie que si un rédacteur rejoint la file (verrou PENDING), les lectures existantes (verrous SHARED) seront terminées, accordera un verrou EXCLUSIVE au processus rédacteur, puis reprendra la lecture. Cela ne prend que quelques millisecondes, ce qui signifie que le débit effectif de la transaction sera à peine supérieur au taux de 60/s indiqué ci-dessus.
Je crois que la valeur par défaut sqlite3 WAIT sur un verrou EXCLUSIVE est de 3 secondes. Par conséquent, compte tenu du fait que 60 transactions par seconde est une attente raisonnable et que vous souhaitez écrire dans la base de données en moyenne toutes les 10 secondes, je dirais que sqlite3 se présente bien. à la tâche et ne nécessitera l’introduction de la mise en cluster que lorsque votre trafic sera multiplié par 500.
Pas mal et parfait pour votre exigence.
Voici ce que SQLite a à dire sur les utilisations appropriées de SQLite: http://www.sqlite.org/whentouse.html En particulier, cette page indique que SQLite convient aux sites à trafic faible, exactement le genre de application que vous envisagez.
On dirait que SQLite fonctionnerait pour vous, sauf si vous vous attendez à une croissance substantielle. En fonction de ce que vous faites dans chaque requête, je m'attendrais à ce qu'un taux d'interrogation de 0,17 requêtes par seconde soit bien dans les capacités de SQLite.
Pour une bonne expérience utilisateur, vous devez concevoir votre site de sorte que les requêtes nécessaires pour traiter une requête unique prennent environ 200 millisecondes. Pour ce faire, les ensembles de résultats ne doivent probablement pas toucher plus de quelques lignes de score; et devrait s'appuyer sur des indeces et non sur des analyses de table complètes. Si vous y parvenez, vous aurez suffisamment de marge pour traiter 5 requêtes par seconde (au maximum). C'est 30 fois l'exigence que vous énoncez dans votre question.
Le SQLite FAQ couvre ce sujet: http://www.sqlite.org/faq.html (Voir: "(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? ")
Mais pour votre utilisation particulière, vous voudrez probablement faire quelques tests de stress pour vérifier que cela répond à vos besoins. 100 utilisateurs simultanés pourraient être un peu trop pour SQLite.
J'ai lu la FAQ, et il semble que SQLite supporte assez bien la concurrence, mais peut nécessiter l'utilisation de transactions pour être sure les choses vont bien se passer.
Les commentaires ci-dessus concernant la simultanéité Apache sont corrects: un serveur Apache peut traiter plusieurs demandes, le nombre dépend du nombre de processus exécutés. La plupart des serveurs que je fais fonctionner sont configurés de 3 à 5 processus, alors que sur des installations plus grandes, ils pourraient atteindre 20. Le problème est que SQLite peut gérer plus que des sites Web à trafic faible à moyen, car il peut effectuer des milliers d'insertions. une seconde.
Je prévois d’utiliser SQLite pour mon projet actuel, mais pour des raisons de sécurité, j’ai l’intention totale d’utiliser BEGIN TRANSACTION et COMMIT pour toute écriture ou tout élément sensible à la concurrence.
En bout de ligne, comme d’habitude, lisez le manuel.
En plus de la discussion ci-dessus à propos de sqlite3, Une nouvelle fonctionnalité d’Awesome est présentée dans sqlite v 3.7.0 est (mode WAL) (mode WAL) Journal d’écriture anticipé - que vous pouvez lire à partir de plusieurs processus et écrire avec un processus en même temps.
jettes un coup d'oeil à; http://www.sqlite.org/wal.html