DatabaseFileLockedException ездит меня с ума
-
02-10-2019 - |
Вопрос
Я следую в примере здесь: http://developer.db4o.com/forums/tabid/98/aft/10114/default.aspx. Чтобы настроить мое приложение MVC2 с DB4O с помощью httpmodule. У меня также есть экземпляр linqpad, открытый для запроса данных, как я разрабатываю. Веб-приложение, похоже, работает как шарм, но LinqPad продолжает получать базы данныхFilelockedExceptions, пока не закрываю веб-сервер.
Как я уже сказал, я использую HTPModule из Gamlor практически Verbatim (используя клиентервер вместо встроенного - это единственное значение), а вот мой код 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 работает нормально, если веб-сервер не работает.
Что я делаю неправильно?
Решение
Когда вы открываете базу данных DB4O, он блокирует файл базы данных для предотвращения повреждения повреждения. Это означает, что ваш сервер работает, файл базы данных заблокирован, а другой процесс не может получить доступ. (Да, есть способ отключить это, но это почти наверняка коррумпировано в базу данных)
Является ли вы WebServer также запустить режим клиентского сервера? Если это то, что вы можете подключить запущенный 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
}