Проблема блокировки в ASP.NET при отладке - PullRequest
1 голос
/ 18 октября 2010

Я использую lucence.net, который создает файл как «блокировку».Из того, что я могу сказать, он просто создает файл для записи, и если он не может, БД заблокирована.Я получаю исключение ниже

Я вызываю lucence_init () за исключением того, что это происходит один раз.Я вызываю его в Application_Start после того, как установил текущую рабочую папку и другие вещи.

Я не могу сказать, когда это произойдет, но я знаю, что это происходит только тогда, когда я нажимаю F5 в визуальных студиях.И это (очевидно) никогда не происходит в первый раз.Я думаю , что это происходит, когда я получаю исключение, нажимаю "Стоп", исправляю и пытаюсь запустить код.Мне нужно использовать значок на панели задач, чтобы остановить веб-сервер VS и перезапустить код (иногда вручную удаляя файл блокировки, но теперь у меня есть визуальные студии, которые делают это как событие после сборки. Что странно, возможно, мне эта часть не нужна)

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

Lock obtain timed out: NativeFSLock@c:\dev\prj\...\App_Data\LuceneIndex_a\write.lock: System.IO.IOException: The process cannot access the file 'c:\dev\prj\...\App_Data\LuceneIndex_a\write.lock' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at Lucene.Net.Store.NativeFSLock.Obtain()

Ответы [ 3 ]

3 голосов
/ 18 октября 2010

Что ж, если вы уверены, что используете только один модуль записи индекса Lucene.Net одновременно, то это исключение происходит из-за ранее неудачной записи индекса, которая оставила файл write.lock в вашем каталоге индекса.

Решение состоит в том, чтобы изменить ваш lucene_init (), чтобы явно разблокировать каталог индекса перед созданием IndexWriter. Ваш код может выглядеть так:

IndexWriter writer = null;
try {
    writer = new IndexWriter(indexDir, DefaultAnalyzer);
}
catch (LockObtainFailedException ex) {
    DirectoryInfo indexDirInfo = new DirectoryInfo(indexDir);
    FSDirectory indexFSDir = FSDirectory.Open(indexDirInfo, new Lucene.Net.Store.SimpleFSLockFactory(indexDirInfo));
    IndexWriter.Unlock(indexFSDir);
    writer = new IndexWriter(indexDir, DefaultAnalyzer);
}
0 голосов
/ 19 октября 2010

Кажется, проблема была в том, чтобы избавиться от писателя. Я оставил это как переменную-член вместо того, чтобы иметь область действия одной функции. Изменение и использование .Close () полностью исправило это.

0 голосов
/ 18 октября 2010

Lucene.Net создает файл блокировки, когда ваш индекс открывается для записи в него.Если индекс открыт, но закрыт неправильно, файл блокировки останется.Когда вы отлаживаете, возможно, что индекс открывается, но происходит исключение (или вы отменяете запущенный процесс), прежде чем его правильно закрыть.Трудно сказать, каково ваше конкретное решение без каких-либо подробностей, но я бы посоветовал исправить проблемный код, не включая открытие индекса, если это возможно, или явное закрытие средства записи индекса перед переходом к остальной части кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...