1

http://developer.db4o.com/Forums/tabid/98/aft/10114/Default.aspxの例に従って、HttpModuleを使用してdb4oでMVC2アプリをセットアップします。また、開発中にデータをクエリするためにLINQPadインスタンスを開いています。Webアプリは魅力のように機能しているようですが、LINQPadは、Webサーバーを閉じるまでDatabaseFileLockedExceptionsを取得し続けます。

私が言ったように、私はGamlorのHttpModuleを実質的に逐語的に使用しています(埋め込みの代わりに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サーバーが実行されていない場合は正常に機能します。

私は何が間違っているのですか?

4

1 に答える 1

2

db4oデータベースを開くと、破損を防ぐためにデータベースファイルがロックされます。これは、サーバーの実行中はデータベースファイルがロックされ、他のプロセスがアクセスできないことを意味します。(はい、これを無効にする方法はありますが、それはほぼ確実にデータベースを破壊します)

Webサーバーもクライアントサーバーモードを実行していますか?その場合は、実行中のdb4o-instanceを接続できます。また、最初に接続を試みることができますが、失敗した場合にのみサーバーを直接開くことができますか?

ASP.NETアプリケーションで組み込みクライアントサーバーのみを使用している場合は、デバッグ目的で実際のクライアントサーバーに変更できます。ASP.NETは、組み込みクライアントのみを使用します。ただし、LINQ-Padに接続できます。

コメントへの回答:

ネットワーク経由で接続するクライアントをサポートする完全なサーバーを開く必要があります。例えば:

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

}
于 2010-08-30T13:33:14.370 に答える