代码之家  ›  专栏  ›  技术社区  ›  Matthew Groves

DatabaseFileLockedException让我抓狂

  •  1
  • Matthew Groves  · 技术社区  · 14 年前

    我在这里举一个例子: http://developer.db4o.com/Forums/tabid/98/aft/10114/Default.aspx 使用HttpModule用db4o设置MVC2应用程序。在开发过程中,我还打开了一个LINQPad实例来查询数据。这个web应用看起来很有魅力,但是LINQPad一直在获取DatabaseFileLockedExceptions,直到我关闭web服务器。

    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";
    

    我做错什么了?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Gamlor Gabriele Ran    14 年前

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

    您的Web服务器是否也运行客户机-服务器模式?如果是这种情况,您可以连接正在运行的db4o实例。你也可以先尝试连接,只有当你失败时才直接打开服务器?

    如果您只在您的系统中使用嵌入式客户机服务器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
         }
    
    }
    

    然后在林帕德:

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