Lucene. Сеть и проблема Поточной обработки ввода-вывода

Я соглашаюсь с тем, что, кажется, согласие здесь (возвратите пустой указатель, если "не найденный" нормальный возможный исход, или выдайте исключение, если семантика ситуации требует, чтобы объект всегда был найден).

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

6
задан John Sheehan 14 July 2009 в 05:07
поделиться

4 ответа

Убедитесь, что на общем хосте поток имеет те же права доступа к папке индекса, что и на машине разработки / общем хосте.

Обновление: Вы можете найти то, что Принципал , под которым выполняется поток, путем опроса свойства потока CurrentPrincipal . Хотя это свойство доступно для чтения и записи, у вас может не быть разрешений на установку этого свойства в среде с общим хостом.

Вы можете найти этот пост полезным.

4
ответ дан 17 December 2019 в 02:32
поделиться

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

В «IndexWriter» у вас есть

  Lock @lock = this.directory.MakeLock("write.lock");
  if (!@lock.Obtain(this.writeLockTimeout))

, который указывает на реализацию SimpleFSLock. Виновником было

new FileStream(this.lockFile.FullName, FileMode.CreateNew).Close();

создание нового потока, внутренне он генерирует исключение system.unauthorizedaccessexception, согласно msdn здесь

При запуске нового потока System.Security.Principal.WindowsIdentity.GetCurrent () возвращает идентификация процесса, не обязательно идентификатор кода, который вызвал Thread.Start (). Это важно помнить при запуске асинхронных делегатов или потоков в олицетворенном потоке ASP.NET.

Если вы работаете в ASP.NET и хотите, чтобы новый поток запускался с олицетворением WindowsIdentity, передать WindowsIdentity методу ThreadStart. В методе ThreadStart вызовите WindowsIdentity.Impersonate ().

Таким образом, я решил свою проблему, олицетворяя учетную запись IIS, выполняющую мое приложение в функции «Execute ()», и все проблемы были решены.

Еще раз спасибо всем.

2
ответ дан 17 December 2019 в 02:32
поделиться

Вероятно, худший вариант, чтобы попытаться ответить на этот вопрос, поскольку я не использовал lucene / общий хостинг, но SimpleFSLock звучит так, как будто он блокирует файл индекса lucene с помощью файла явной блокировки в файловой системе (не совсем то же самое, что блокировка в потоке). Я бы сказал, проверьте, правильно ли вы настроили пути к файлам и что права доступа к файлам установлены правильно.

В противном случае, надеюсь, кто-то, более знакомый с Lucene.net, сможет ответить.

0
ответ дан 17 December 2019 в 02:32
поделиться

Я считаю, что проблема связана с файлом блокировки записи в индексном каталоге Lucene. Перейдите и составьте список файлов каталога. В Java Lucene вы бы увидели файл с именем write.lock в каталоге index, Это означает, что индекс не был должным образом закрыт в прошлый раз (возможно, процесс был внезапно остановлен). В Lucene.net найдите пустой файл с таким же названием. Я считаю, что такой же механизм будет использоваться в Lucene.net. Попробуйте найти этот файл, стереть его и перезапустить Lucene.net.

0
ответ дан 17 December 2019 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: