2010-10-18 2 views
1

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

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

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

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

Lock obtain timed out: [email protected]:\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() 

ответ

0

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

+0

IIRC theres только один раз функция, которая ПИСАТЕТ к lucence, и я уверен, что исключения не происходят в этой строке. Но в любом случае проблема заключается в том, что я снова запускаю приложение, и он пытается открыть lucence, хотя каким-то образом он все еще удерживает блокировку. Есть ли способ убить процесс или сделать ЧТО-ТО, когда закончится мой процесс или как раз перед тем, как я его снова запустил. На самом деле я уверен, что исключение никогда не происходит, когда я пишу bc, информация застревает внутри структуры, а затем вызывает функцию для вставки и ничего другого. Так ... ... его во время записи .... – 2010-10-18 06:16:51

3

Ну, если вы уверены, что одновременно используете только одного автора индекса 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

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

Смежные вопросы