Ruby: SQLite3 :: BusyException: la firebase database est verrouillée:

Ce message d’erreur SQLite3::BusyException: database is locked: en cours de développement ce soir: SQLite3::BusyException: database is locked:

J’ai deux modèles:

  • Les podcasts ont beaucoup de pistes
  • Les pistes appartiennent à des podcasts.
  • Les fichiers podcast sont hébergés sur mixcloud .

Pour créer un podcast:

  • l’utilisateur soumet une URL pour un podcast sur mixcloud
  • l’application rails récupère le stream json associé à l’url
  • json est utilisé pour définir des atsortingbuts (titre, image, etc.) sur le nouvel object Podcast

J’essaie de faire en sorte que l’application de rails utilise le fait que le stream json détaille également les noms (et les artistes) des pistes appartenant à ce podcast.

Je pensais que la méthode before_validation suivante créerait automatiquement toutes les pistes associées chaque fois que nous créerions un nouveau podcast.

 class Podcast section.track.name, :podcast_id=>self.id) end end end end 

Comment puis-je contourner cela? Il semblerait que rails (ou sqlite3) n’aime pas me créer de nouvelles instances d’un modèle associé de cette manière. Comment puis-je faire cela? Je soupçonne que c’est autant un problème de rails qu’un problème de sqlite3. Je peux poster plus de code si ça va aider.

Pour toute autre personne rencontrant ce problème avec le locking SQLite en cours de développement lorsqu’une console Rails est ouverte, essayez ceci:

Il suffit de lancer ce qui suit:

 ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;") 

Pour moi, de toute façon, cela semble effacer toute transaction que la console tenait et libère la firebase database.

C’est particulièrement un problème pour moi lors de l’exécution de delay_job, qui semble ne pas réussir à fermer la transaction assez souvent.

SQLite n’est pas vraiment censé être utilisé pour les access concurrents, ce qui est le problème que vous rencontrez ici. Vous pouvez essayer d’augmenter le délai d’attente dans votre fichier database.yml , ce qui peut être une solution de contournement pour vous dans ce cas. Cependant, je vous recommande de passer à une autre firebase database qui prend en charge plusieurs connexions telles que MySQL ou PgSQL.

Pour moi, le problème était que la console Rails que j’avais ouverte depuis quelque temps bloquait une connexion avec SQLite.

Donc, une fois que j’ai quitté cette console et que j’ai redémarré mon serveur Web (Thin), cela fonctionnait parfaitement.

J’ai essayé la suggestion de @ sortingsweb mais cela n’a pas fonctionné pour moi.

J’avais le même “ActiveRecord :: StatementInvalid: SQLite3 :: BusyException: la firebase database est verrouillée: INSERT INTO” users “(” created_at “,” email “,” name “,” password_digest “,” updated_at “) , ?, ?, ?)” problème. J’ai essayé partout dans Google et j’ai échoué. Le problème a été résolu pour moi lorsque j’ai fermé mon navigateur de firebase database SQLite.

Assurez-vous de ne pas avoir 2 gardes ou plusieurs consoles. Si vous voulez vous assurer de voir désespérément la réponse “No Name” ci-dessus.

Vous pouvez également essayer d’augmenter le pool:

par exemple: changez la section de test dans votre config / database.yml comme ci-dessous

 test: adapter: sqlite3 database: db/test.sqlite3 pool: 50 timeout: 5000 

Vous avez probablement une console Rails ouverte sur une autre bash si vous devez la fermer (ctrl + D).

En fait, pour moi, j’ai trouvé que tuer des rails aide à résoudre ce problème.

utilisez "ps aux | grep rails" pour trouver l’ID de processus de rails en cours. puis utiliser

 "kill -9 [rails-pid]" 

pour tuer les processus.

Alors ça va marcher

Ce n’est probablement pas lié au code des rails. L’utilisation simultanée de la console avec l’option sandbox ( rails console --sandbox ) rend le problème systématique avec SQLite, car la console attend essentiellement de quitter pour annuler tout.

La solution de @sortingsweb ci-dessus ne fonctionnera pas dans ce cas, mais quittera la console.

Oui, c’est une vieille question et il y a déjà beaucoup de réponses ici. Mais aucun d’entre eux ne fonctionnait pour moi, c’est-à-dire qu’il m’a fallu beaucoup de temps pour trouver le problème. J’ai trouvé ce qui a fonctionné et je le partagerai au cas où ce serait le problème pour vous aussi.

J’utilisais le navigateur SQLITE (son navigateur de firebase database GUI). Je l’appellerai ici “GUI” (pour éviter toute confusion avec le navigateur de mots étant votre navigateur chrome localhost :: 8000 ou autre).
http://sqlitebrowser.org/

Je surveillais ce qui était écrit dans la firebase database et l’interface graphique était ouverte alors que mon application rails fonctionnait dans mon navigateur chrome. Je rafraîchirais l’interface graphique pour voir si elle ajoutait les données comme je m’y attendais.

En ce qui concerne le débogage, j’avais décidé de supprimer une ligne de l’interface graphique de SQLite afin de voir si mon application réagirait correctement à l’absence de la ligne.

En réalité , le navigateur SQLite ne supprime pas la ligne (ce qui crée une confusion quant à la raison pour laquelle mon application agissait comme si la ligne était toujours là, même si elle manquait visuellement sur l’interface graphique). Quoiqu’il en soit, après 30 minutes de frustration, j’ai fermé l’interface graphique de SQLite, puis j’ai reçu un avis me demandant si je voulais enregistrer les modifications apscopes à la firebase database. J’ai naïvement cliqué sur “Non” et fermé l’application.

Apparemment, ce qui se passe est que l’interface graphique a ensuite verrouillé la firebase database car il y avait des lignes dans ma firebase database qui avaient été en quelque sorte «supprimées en douceur» sans s’être engagées dans la suppression. Ainsi, l’interface graphique était (faute d’un meilleur terme) détenant la firebase database dans Limbo.

Cela explique pourquoi a) mon application n’agissait pas comme si la ligne manquait, car elle n’avait pas encore été supprimée, et B) explique pourquoi la firebase database était bloquée. Il attendait toujours que je commette les suppressions.

Donc, pour résoudre le problème, j’ai simplement rouvert l’interface graphique et supprimé la même ligne, puis j’ai fermé l’interface graphique et cette fois j’ai cliqué sur “Oui” en demandant d’enregistrer les modifications dans la firebase database . Il a enregistré la suppression et débloqué la firebase database et maintenant mon application fonctionne!


J’espère que cela aidera quelqu’un d’autre qui pourrait avoir le même problème mais qui utilisait l’interface graphique de SQLite Browser. C’est peut-être ce qui verrouille votre firebase database.

J’ai eu le même problème. Pour ceux avec le navigateur de firebase database SQLite. Je n’ai pas eu besoin de fermer le navigateur de firebase database SQLite. Je n’ai eu qu’à cliquer sur le bouton “Write Changes”. Il est mis en évidence et ne doit pas être mis en évidence.

SQLite a des problèmes avec la concurrence. J’ai changé de sqlite sur Postgresql et le problème est résolu

Cela se produit lorsque vous apportez des modifications manuellement directement dans le SQlite DB Browser (comme supprimer une ligne ou modifier la valeur de n’importe quelle colonne) et oubliez d’enregistrer ces modifications. Toutes les modifications apscopes doivent être enregistrées ( ctrl + s ). Si elle n’est pas enregistrée, SQLite verrouille la firebase database jusqu’à ce que vous enregissortingez ces modifications.

J’ai fait la même chose et mon problème a été résolu!

mon problème est: j’ai ouvert un programme de gestion de firebase database nommé “DB Browser for SQlite”. Ce programme de gestion de firebase database a été fermé et le problème résolu.

J’utilisais DB Browser pour SQLite et la console de rails simultanément. La fermeture du DB Browser for SQLite résolu le problème pour moi.

Essayez de redémarrer le serveur ou de fermer toute console de rails en fonctionnement, cela a fonctionné pour moi