La base de données Sqlite verrouillé
Je suis en utilisant asp.net c# et le téléchargement d'une base de données SqLite à un serveur, puis je fais un peu de l'insertion et de mise à jour. Le problème, c'est que parfois (je pense que c'est quand les choses vont mal avec la mise à jour ou si) de la base de données est verrouillée. Donc, la prochaine fois que j'essaie de télécharger un fichier c'est encore verrouillé et j'obtiens un message d'erreur indiquant que "Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus". Peut-être que le fichier de base de données n'est pas supprimée si quelque chose se passe mal lors de la transaction? La seule chose pour résoudre ce problème est de redémarrer le serveur.
Comment puis-je régler cela dans mon code, donc je peux être sûr que c'est toujours déverrouillé même si quelque chose va mal?
C'est mon code:
try
{
string filepath = Server.MapPath("~/files/db.sql");
//Gets the file and save it on the server
((HttpPostedFile)HttpContext.Current.Request.Files["sqlitedb"]).SaveAs(filepath);
//Open the database
SQLiteConnection conn = new SQLiteConnection("Data Source=" + filepath + ";Version=3;");
conn.Open();
SQLiteCommand cmd = new SQLiteCommand(conn);
using (SQLiteTransaction transaction = conn.BeginTransaction())
{
using (cmd)
{
//Here I do some stuff to the database, update, insert etc
}
transaction.Commit();
}
conn.Close();
cmd.Dispose();
}
catch (Exception exp)
{
//Error
}
Les Threads de quelle manière? Pas dans mon asp.net code, dans le sqlite code je ne suis pas sûr, mais je ne le pense pas?
asp.net est multithread, même lorsque vous n'avez pas explicitement les créer. Sinon, comment peut asp.net traiter les demandes des différents utilisateurs? Lorsque vous modifiez un sqlite db, l'ensemble de la db est verrouillé. Vous pouvez faire multithread lecture avec sqlite, mais une écriture (insert, update, delete, create table) verrouille l'ensemble de la db. Je pense que vous devez utiliser .net readerwriter-verrouillage de la classe.
OriginalL'auteur | 2009-07-22
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de placer la Connexion à l'aide du bloc, ou en appelant le Jeter sur elle:
Cela permettra d'assurer que vous êtes l'élimination de la connexion de l'objet correctement (vous n'êtes pas à l'instant, que la fermeture).
Les enveloppant dans l'aide de blocs assure que Jeter, même si une exception se produit - c'est effectivement la même que l'écriture:
Le code dans le bloc finally va être appelé quelle que soit l'exception, et vous aide à nettoyer.
Oui: msdn.microsoft.com/en-us/library/xhcbs8fz.aspx
OriginalL'auteur Zhaph - Ben Duguid
Un asp.net application multithread dans le serveur.
Vous ne pouvez pas faire simultané de l'écriture (insert, select, update...) parce que l'ensemble de la db est verrouillé. En sélectionnant simultanément est autorisé lors de l'absence d'écriture qui se passe.
Vous devez utiliser l' .NET ReaderWriterLock classe: http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx
OriginalL'auteur tuinstoel
Ne devriez-vous pas faire
cmd.Dispose()
avantconn.Close()
? Je ne sais pas si cela fait une différence, mais en général, vous voulez nettoyer les choses à l'inverse de l'ordre d'initialisation.OriginalL'auteur Tim Sylvester
En bref, SQLite poignées de ressources non gérées un peu différemment que les autres prestataires. Vous devrez explicitement dispose de la commande (qui semble fonctionner même si vous travaillez avec le lecteur, en dehors de l'aide() bloc.
Lire ce fil de discussion pour plus de saveur:
http://sqlite.phxsoftware.com/forums/p/909/4164.aspx
OriginalL'auteur Doug