2012-10-17 4 views
2

Je tente d'utiliser une base de données SQLite avec un projet AIR et il semble y avoir quelques questions sur lesquelles je n'arrive pas à trouver les réponses sur Internet, en particulier celles concernant les meilleures pratiques.Adobe Air SQLite Malentendu

  1. La première est d'avoir des connexions multiples dans la même instance de l'application. Certains processus d'application nécessitent l'utilisation d'une base de données pendant une fraction de seconde, et seraient mieux servis par un flux de code de type synchrone (try {} catch() {}). Certains processus peuvent prendre un certain temps et seraient mieux servis par un flux de code asynchrone avec un AsyncResponder. Pour cette raison, j'ai pensé à avoir un ConnectionPoolManager qui aurait plusieurs instances d'async et une instance de mes classes SQLConnection de synchronisation. Est-ce une idée décente, bonne ou absolument atroce? Cela m'amène à mon prochain point.

  2. Existe-t-il un problème d'avoir plusieurs connexions asynchrones exécutant leurs instructions asynchrones en parallèle? J'ai vu des gens se plaindre de la fermeture de la base de données, et j'ai lu qu'une seule instruction peut effectuer une écriture à la fois. Que se passe-t-il si une instruction d'écriture est appelée à s'exécuter (nouvelle Async ...) alors qu'une autre est occupée? Une erreur sera-t-elle lancée ou attendra-t-elle un délai?

Toute précision à ce sujet serait grandement appréciée. Je continue à courir dans des sources qui répondent à des questions ponctuelles, mais pas à ma question en particulier. Habituellement, j'allais le tester moi-même, mais je crains de ne pas pouvoir reproduire l'erreur du piège qui ne se manifestera qu'à des niveaux d'utilisation plus élevés.

EDIT: Voici une documentation concernant le problème que j'ai trouvé après avoir perdu la moitié de la journée. Adobe Doc

Répondre

2

SQLite n'a pas de concordance d'écriture; un écrivain bloquera tous les autres lecteurs et écrivains.

Lorsqu'un tel conflit se produit, un SQLError avec l'ID 3119 sera lancé. Dans ce cas, l'application doit attendre et réessayer. SQLite a un paramètre intégré pour faire une telle attente automatiquement, mais cela n'est pas exposé par Air. Vous auriez à le faire manuellement dans votre code, qui is not easy.

Par conséquent, il serait plus facile d'avoir une seule connexion à SQLite. Si vous souhaitez l'utiliser de manière asynchrone, vous devez gérer les accès avec un Mutex.

+0

Merci l'homme. C'est un peu déprimant, car cela demande BEAUCOUP plus de complexité quand on travaille avec le db. Je pense que je vais poster ceci sur les forums d'Adobe pour voir si quelqu'un a des astuces de conception sur cette question car je sais que je ne suis pas le premier à l'avoir rencontré. Je souhaite qu'il y avait un moyen d'exposer le paramètre timeout. –