2010-08-29 142 views
1

我在这里的例子:http://developer.db4o.com/Forums/tabid/98/aft/10114/Default.aspx用db4o使用HttpModule设置我的MVC2应用程序。我还开发了一个LINQPad实例来查询我开发的数据。 Web应用程序似乎像一个魅力,但LINQPad不断得到DatabaseFileLockedExceptions,直到我关闭Web服务器。DatabaseFileLockedException让我疯狂

正如我所说的,我使用的是从Gamlor的HTTP模块几乎逐字(使用ClientServer上,而不是嵌入是唯一的区别),这是我的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"; 

的LINQPad代码,如果工作正常Web服务器未运行。

我在做什么错?

+1

您能够确定哪些文件被锁定? Web服务器是否在尝试连接时锁定数据库文件? ProcMon或FileMon,或许与ProcExp的句柄监听功能相结合,在这里可能会很有用。 – 2010-08-29 15:18:41

+0

是的,这里只有一个文件“blah.db4o”。我很确定这个网络应用锁定了LINQPad,但它并没有锁定其他网络线程,所以我想我没有正确地关闭文件或其他东西... – 2010-08-29 16:25:52

回答

2

当您打开db4o数据库时,它会锁定数据库文件以防止损坏。这意味着当您的服务器正在运行时,数据库文件被锁定,其他进程无法访问它。 (是的,有一种方法可以禁用此功能,但几乎肯定会损坏数据库)

您是否也是运行客户端服务器模式的webserver?如果是这种情况,你可以连接正在运行的db4o-instance。您也可以先尝试连接,并且只有在您无法直接打开服务器时才能连接。

如果您只在ASP.NET应用程序中使用嵌入式客户端服务器,则可以将其用于调试目的更改为实际客户端服务器。 ASP.NET只使用嵌入式客户端。但它可以让你连接LINQ-Pad。

答案的评论:

您需要打开一个fully server,支持其通过网络连接的客户端。例如:

// 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 
    } 

} 

然后在LINQPad:

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

} 
+0

我正在使用客户端/ Web应用程序和LINQPad中的服务器。如果我没有对服务器对象的引用,如何从LINQPad连接到运行db4o的实例? – 2010-08-30 15:40:09