2009-04-18 3 views
1

Je voudrais implémenter la mise en cache dans la base de données SQLite. Mon objectif principal est d'écrire des données à RAM et lorsque le cache est rempli, je veux vider toutes les données sur la base de données du disque. Je voudrais savoir si c'est possible du tout? Si possible, puis-je avoir quelques exemples de codes?comment nous pouvons assurer la mise en cache pour réduire le cycle d'écriture du système de fichiers pour les bases de données SQLite

Merci

Répondre

4

SQLite fait déjà son propre en tant que cache, ce qui est susceptible d'être plus efficace que tout ce que vous pouvez mettre en œuvre - vous pouvez lire sur l'interface à elle here. Vous pouvez être intéressé par d'autres optimisations - il y a une FAQ here.

1

Depuis SQLite est transactionnel, il repose sur fsync pour assurer un ensemble de déclarations ont terminé lorsqu'une transaction est validée. La vitesse et l'implémentation de fsync varient d'une plateforme à l'autre. Ainsi, en groupant plusieurs instructions dans une transaction, vous pouvez obtenir une augmentation significative de la vitesse car plusieurs blocs de données seront écrits avant l'appel de fsync.

Un article sqlite plus ancien here illustre cette différence entre faire plusieurs INSERT à l'intérieur et à l'extérieur des transactions.

Toutefois, si vous écrivez une application nécessitant un accès simultané aux données, notez que lorsque sqlite démarre une transaction d'écriture, toutes les lectures (instructions select) seront bloquées. Vous pouvez explorer l'utilisation de votre cache en mémoire pour récupérer des données pendant qu'une transaction d'écriture est en cours. Cela dit, il est également possible que le système de mise en cache de sqlite gère cela pour vous.

0

Pourquoi voulez-vous faire cela? Vous rencontrez des problèmes de performances? Ou voulez-vous empêcher les autres connexions de voir les données jusqu'à ce que vous les validiez sur le disque? En ce qui concerne la synchronisation sur disque, il existe un compromis entre l'intégrité et la vitesse de la base de données. Ce que vous voulez dépend de votre situation.

  1. Utiliser les transactions. Avantages: Haute fiabilité et simple. Inconvénients: une fois que vous démarrez une transaction, personne d'autre ne peut écrire dans la base de données tant que vous n'avez pas COMMIT ou ROLLBACK. C'est généralement la meilleure solution. Si vous avez beaucoup de travail à faire en même temps, commencez une transaction, écrivez tout ce dont vous avez besoin, puis COMMIT. Toutes vos modifications seront mises en cache dans la RAM jusqu'à ce que vous COMMIT, date à laquelle la base de données sera explicitement synchronisée sur le disque.

  2. Utiliser PRAGMA journal_mode=MEMORY et/ou PRAGMA synchronous=OFF. Avantages: Haute vitesse et simple. Inconvénients: La base de données n'est plus sûre contre la perte de puissance et les accidents de programme. Vous pouvez perdre la totalité de votre base de données avec ces options. Cependant, ils évitent de se synchroniser explicitement sur le disque aussi souvent.

  3. Ecrivez vos modifications sur un in-memory database et synchronisez-les manuellement lorsque vous le souhaitez. Avantages: Haute vitesse et fiable. Inconvénients: Compliqué, et un autre programme peut écrire dans la base de données sans que vous le sachiez. En écrivant dans une base de données en mémoire, vous n'avez jamais besoin de synchroniser sur le disque jusqu'à ce que vous le vouliez.D'autres programmes peuvent écrire dans le fichier de base de données et, si vous ne faites pas attention, vous pouvez remplacer ces modifications. Cette option est probablement trop compliquée pour en valoir la peine.

+1

Bonjour, Je voudrais utiliser cette base de données dans mon ARM9 linux embarqué platform.Here J'utilise une mémoire flash pour la mémoire de données ont un problème de cycles.So d'écriture que je veux WRTE à la RAM et après le remplissage de RAM je veux le rincer à la base de données de disque. comment je peux implémenter ceci? N'importe quels codes d'échantillon ou n'importe quel document que je peux obtenir? –

Questions connexes