2010-08-29 4 views
1

Je suis l'exemple ici: http://developer.db4o.com/Forums/tabid/98/aft/10114/Default.aspx pour configurer mon application MVC2 avec db4o en utilisant un HttpModule. J'ai aussi une instance LINQPad ouverte pour interroger les données au fur et à mesure de mon développement. L'application Web semble fonctionner comme un charme, mais LINQPad continue à obtenir des exceptions DatabaseFileLocked jusqu'à ce que je ferme le serveur Web.DatabaseFileLockedException me rend fou

Comme je l'ai dit, j'utilise le HttpModule de Gamlor pratiquement mot à mot (en utilisant ClientServer au lieu de incorporé est la seule différence), et voici mon code LINQPad:

01 void Main() 
02 { 
03  using(var server = Db4oClientServer.OpenServer(db4opath, 0)) 
04  { 
05   using(var db = server.OpenClient()){ 
06    var result = (from Object o in db select o); 
07    result.Dump(); 
08   } 
09  } 
10 } 
11  
12 private string db4opath = @"C:\blah\blah\blah\blah.db4o"; 

Le code LINQPad fonctionne très bien si la Le serveur Web n'est pas en cours d'exécution.

Qu'est-ce que je fais mal?

+1

Êtes-vous en mesure de déterminer quel fichier est verrouillé? Le serveur Web verrouille-t-il les fichiers de la base de données pendant que vous essayez également de vous connecter? ProcMon ou FileMon, peut-être couplé avec la fonctionnalité d'espionnage des poignées de ProcExp, pourrait être utile ici. –

+0

ouais il n'y a qu'un seul fichier, "blah.db4o" dans ce cas. Je suis à peu près sûr que l'application web verrouille LINQPad, mais elle ne bloque pas les autres threads web, donc je pense que je ne ferme pas le fichier correctement ou quelque chose ... –

Répondre

2

Lorsque vous ouvrez la base de données db4o, le fichier de base de données est verrouillé pour éviter toute corruption. Cela signifie que pendant que votre serveur est en cours d'exécution, le fichier de base de données est verrouillé et aucun autre processus ne peut y accéder. (Oui, il existe un moyen de désactiver cela, mais cela va certainement corrompre la base de données)

Votre serveur web fonctionne-t-il également en mode serveur client? Si c'est le cas, vous pouvez connecter l'instance db4o en cours d'exécution. Vous pouvez également essayer d'abord de vous connecter et seulement si vous n'ouvrez pas directement le serveur?

Si vous n'utilisez que le serveur client incorporé dans votre application ASP.NET, vous pouvez le modifier pour le débogage sur le serveur client réel. ASP.NET utilise uniquement les clients incorporés. Mais cela vous permet de vous connecter avec LINQ-Pad.

Réponse du commentaire:

Vous devez ouvrir un fully server, qui prend en charge les clients qui se connectent sur le réseau. Par exemple:

// in your application 
int PortNumber = 8888; 
using(var server = Db4oClientServer.OpenServer("database.db4",PortNumber)) 
{ 
    server.GrantAccess("debug-user","debug-pwd"); 

    // application uses embedded client: 
    using(var container = server.OpenClient()) 
    { 
      // your application does stuff 
    } 

} 

Et puis dans LINQPad:

using(var client = Db4oClientServer.OpenClient("localhost",8888,"debug-user","debug-pwd")) 
{ 
    // do stuff 

} 
+0

J'utilise le client/serveur dans l'application Web et LINQPad. Comment puis-je me connecter à l'instance en cours d'exécution db4o à partir de LINQPad si je n'ai pas de référence à l'objet serveur? –