DatabaseFileLockedException сводит меня с ума - PullRequest
1 голос
/ 29 августа 2010

Я следую приведенному здесь примеру: http://developer.db4o.com/Forums/tabid/98/aft/10114/Default.aspx для настройки моего приложения MVC2 с помощью db4o с использованием HttpModule. У меня также есть открытый экземпляр LINQPad для запроса данных при разработке. Кажется, что веб-приложение работает как шарм, но LINQPad продолжает получать исключения DatabaseFileLockedException, пока я не закрою веб-сервер.

Как я уже сказал, я использую HttpModule от Gamlor практически дословно (единственное отличие - использование 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 работает нормально, если веб-сервер не работает.

Что я делаю не так?

1 Ответ

2 голосов
/ 30 августа 2010

Когда вы открываете базу данных db4o, она блокирует файл базы данных, чтобы предотвратить повреждение.Это означает, что во время работы вашего сервера файл базы данных заблокирован, и никакой другой процесс не может получить к нему доступ.(Да, есть способ отключить это, но это почти наверняка повредит базу данных)

Вы веб-сервер также работаете в режиме клиент-сервер?В этом случае вы можете подключить работающий экземпляр db4o.Вы также можете сначала попытаться подключиться, и только если у вас не получится напрямую открыть сервер?

Если вы используете только сервер встроенного клиента в приложении 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

}
...