2009-11-09 6 views
2

Bonjour, je reçois des données d'un canal de communication et je l'affiche. Parallèlement, je le sérialise dans une base de données SQLite (en utilisant des instructions SQL INSERT normales). Après la fermeture de l'application, je fais un .commit sur l'objet sqlite. Que se passe-t-il si mon application est interrompue brutalement au milieu? Est-ce que les données les plus récentes (raisonnablement - ne disons pas il y a 100 microsecondes, mais il y a au moins une seconde) sont en sécurité dans la base de données même sans un .commit? Ou devrais-je avoir un engagement périodique? Quels sont les meilleurs modèles pour faire ces choses?Comment sérialiser les données en série


J'ai essayé autocommit (option de sqlite) et cela ralentit le code beaucoup d'un facteur ~ 55 (autocommit contre seulement un commettras à la fin). Le fait de commettre toutes les 100 insertions apporte des performances dans les 20% du mode optimal. Donc, l'autocommit est très lent pour moi.

Mon application pompe beaucoup de données dans DB - que puis-je faire pour que cela fonctionne bien?

Répondre

1

Vous devez effectuer un COMMIT chaque fois que vous effectuez un changement logique. L'une des raisons de la transaction est d'empêcher que des données non validées provenant d'une transaction soient visibles de l'extérieur. Cela est important car parfois, une seule modification logique peut se traduire par plusieurs instructions INSERT ou UPDATE. Si l'une des dernières requêtes de la transaction échoue, la transaction peut être annulée avec ROLLBACK et aucune modification n'est enregistrée.

De manière générale, aucune modification effectuée dans une transaction n'est enregistrée dans la base de données tant que COMMIT n'aboutit pas.

cela ne ralentit-il pas considérablement mon code?- zaharpopov

commits fréquentes, pourrait ralentir votre code, et comme une optimisation, vous pouvez essayer le regroupement de plusieurs changements logiques dans une seule transaction. Mais ceci constitue un changement par rapport à l'utilisation correcte des transactions et vous ne devriez le faire qu'après avoir mesuré que cela améliore significativement les performances.

+0

cela ne ralentit-il pas considérablement mon code? – zaharpopov

3

Vous devez effectuer cette opération dans un délai de transaction et, par conséquent, effectuer un commit aux points appropriés du processus. Une transaction garantira que cette opération est atomic - c'est-à-dire qu'elle fonctionne ou ne fonctionne pas.

atomicité indique que la base de données modifications doivent suivre une règle « tout ou rien ». Chaque transaction est dite "atomique" si une partie de la transaction échoue, la transaction échoue. Il est essentiel que le système de gestion de base de données maintienne la nature atomique des transactions en dépit de tout système d'exploitation DBMS, ou d'une défaillance matérielle.

Si vous n'avez pas validé, les insertions ne seront pas visibles (et seront annulées) lorsque votre processus est terminé.

Quand effectuez-vous ces validations? Lorsque vos insertions représentent quelque chose de cohérent et complète. Par exemple, si vous devez insérer 2 informations pour chaque message, alors validez après avoir inséré les deux informations. Ne vous engagez pas après chacun d'eux, car vos informations ne seront pas cohérentes ou complètes.

2

Les données ne sont pas permanentes dans la base de données sans validation. Utilisez une validation occasionnelle pour équilibrer la vitesse d'exécution de plusieurs insertions dans une transaction (plus le commit est fréquent, plus le processus est lent) avec la sécurité d'avoir des commits plus fréquents.

+0

quelle est la meilleure façon de le faire? compter les insertions et une fois en N commettre? – zaharpopov

+0

Cela dépend principalement de votre application. Vous pouvez le faire une fois par N insertions, ou une fois par unité de temps, ou toute autre source de tiques que vous avez. Vous devez faire le compromis pour votre application. –

Questions connexes