SQlite/ Firebird: L'un d'eux supporte-t-il plusieurs accès simultanés en écriture?

Question: je stocke actuellement ASP.net données d'application dans les fichiers XML.

maintenant, le problème est que j'ai des opérations asynchrones, ce qui signifie que j'ai rencontré le problème de l'accès en écriture simultané sur un fichier XML...

maintenant, j'envisage de passer à une base de données intégrée pour résoudre le problème. Je suis en train d'envisager SQlite et Firebird embeddable.

Je ne suis pas sûr cependant si SQlite ou Firebird peut gérer plusieurs concurrents l'accès en écriture.

Et je ne veux certainement pas le même problème à nouveau.

Quelqu'un sait ?

SQlite est certainement mieux connu, mais lequel est le meilleur - SQlite ou Firebird ? J'ai tendance à dire Firebird, mais je ne sais pas vraiment.

Non MS-Access ou MS-SQL-express recommandations s'il vous plaît, je suis une personne saine.

3
demandé sur Stefan Steiger 2010-05-19 11:30:55

5 réponses

je wll choisir Firebird pour de nombreuses raisons, et pour cela aussi,

bien qu'il soit transactionnel, SQLite ne supporte pas la concurrence les transactions, donc si votre intégré application nécessite deux ou plus connexions, ils doivent être sérialisé. Une base de données Firebird intégrée est simple à mettre à niveau vers un partage pleinement la base de données il suffit de changer le partagé bibliothèque.

peut-être que vous pouvez aussi vérifier ce

6
répondu Hugues Van Landeghem 2017-05-23 10:24:36

SQLITE peut être configuré pour gérer avec élégance les Écritures simultanées dans la plupart des situations. Ce qui se passe, c'est que lorsqu'un thread ou processus commence une écriture à la base de données, le fichier est verrouillé. Quand la deuxième écriture est tentée, et rencontre la serrure, il recule pendant une courte période Avant de tenter à nouveau l'écriture, jusqu'à ce qu'il réussisse ou chronomètre. Le timeout est configurable, mais sinon tout cela se produit sans que le code de l'application ait à faire quoi que ce soit de spécial, sauf option, comme ceci:

// set SQLite to wait and retry for up to 100ms if database locked
sqlite3_busy_timeout( db, 100 );

tout cela fonctionne très bien et sans aucune difficulté, sauf dans deux circonstances:

  1. si une application fait un grand nombre d'Écritures, disons un millier d'encarts, tous dans une transaction, alors la base de données sera verrouillée pour une période importante et peut causer des problèmes pour toute autre application essayant d'écrire. La solution est de briser de telles grandes Écritures en transactions séparées, ainsi autres applications peuvent accéder à la base de données.

  2. si la base de données est partagée par différents processus tournant sur des machines différentes, partageant un disque monté sur le réseau. De nombreux systèmes d'exploitation ont des bugs dans les disques réseau montés qui rendent le verrouillage des fichiers peu fiable. Il n'y a pas de réponse à cela. Si vous avez besoin de partager une base de données sur un disque réseau, vous avez besoin d'un autre moteur de base de données tel que MySQL.

I n'ont pas d'expérience avec Firebird. J'ai utilisé SQLITE dans des situations comme celle-ci pour de nombreuses applications sur plusieurs années.

7
répondu ravenspoint 2010-05-19 23:22:45

avez-vous regardé dans Berkeley DB avec L'API SQLite pour le soutien de SQL?

2
répondu rekounas 2010-11-03 13:00:47

il semble que SQLite sera un bon ajustement. Nous utilisons SQLite dans un certain nombre d'applications de production, il prend en charge, en fait, il préfère transactions qui vont un long chemin à la gestion de la concurrence.

transactionnelle sqlite? in C#

1
répondu Doobi 2017-05-23 12:26:29

je voudrais ajouter #3 à la liste de ravenspoint ci-dessus: si vous avez un grand centre d'appel ou de traitement des commandes, par exemple, où des dizaines de personnes pourraient appuyer sur le bouton Enregistrer en même temps, même si chacun met à jour ou insère juste un enregistrement, vous pouvez courir dans des problèmes en utilisant l'approche de timeout occupé.

pour le scénario #3, un vrai moteur SQL qui peut sérialiser est idéal; moins idéal mais en bon état de service est un SGBD qui peut faire le verrouillage des enregistrements byte-range d'un partagé-fichier. Mais soyez conscient que même un cadenas d'enregistrement de portée byte sera inadéquat pour un grand nombre d'Écritures simultanées quand de nouveaux enregistrements sont ajoutés à la fin du dossier comme un fourgon de queue à l'extrémité d'un train de marchandises, de sorte que les processus multiples essaient en même temps de fixer un cadenas sur la même portée byte. D'autre part, un système de verrouillage des enregistrements en octets couplé à une approche de fichier à clé hachée (par exemple L'ancienne base de données de révélation / OpenInsight pour LANs) sera de loin supérieure à L'ISAM pour ce scénario.

0
répondu Tim 2010-11-03 13:25:08