Добрый вечер коллеги.
Имеется проект, в котором уровень доступа к данным реализован на nHibernate, а для организации поиска — Lucene.net через nHibernate.Search. Данные регулярно обновляются, скажем раз в минуту. При "обновлении" удаляется до 500 индексируемых объектов и добавляется столько же новых. В базе сейчас всего окола 200000 индексируемых объектов, а размер самого индекса lucene-а 62 Mb. Так вот, когда удалять индексируемые объекты не надо (просто добавление новых), то все работает, медленно конечно но работает. Но вот когда приходится удалять, то транзакция коммитится более 5 минут! По логам видно что 100% процентах случаев, когда коммит прерывается таймаутом, люсьен пытается удалить объект из индекса. Причем это происходит с неприятной регулярностью.
что произошло на самом деле:
1. объект Organization#48 был обновлен (на самом деле индексируемое поле не изменилось)
2. удалено 5 объектов Order
3. добавлено 5 новых объектов Order.
меня смущают 3 момента:
1. удаление из индекса занимает 11 секунд!
2. добавление Organization занимает 3 секунды, в строке Name было 6 слов, длинна строки всего 80 символов
3. где же 5 удаленных Order-ов?
Здравствуйте, sinister, Вы писали:
S>... все работает, медленно конечно но работает.... S>Подскажите, в какую сторону тут вообще копать.
Честно скажу, я бы копал в сторону другого движка.
В одном проекте использовал Люсин, производительности добились более-менее нормальной. Требования к скорости обновления — секунду назад Но чего это стоило... По ходу, по краней мере в .НЕТ порте, логика построена на исключениях Так что пришлось основные места просто переписать. Порт активно не поддерживается, качество — уй..ня полная.
Для вашего объема данных пойдет RAMDirectory (или как так его) и SingleInstanceLockFactory. А вообще, пока не поздно — в топку...