NHibernate, Parallel Framework и SQL Server - PullRequest
0 голосов
/ 25 мая 2010

Эй, ребята, у нас есть цикл, который:

1. Повторяет несколько тысяч XML-файлов. Всего мы анализируем миллионы «пользовательских» узлов.

2. В каждой итерации мы анализируем «пользовательский» xml, выполняем пользовательскую десериализацию

3. Наконец, на каждой итерации мы отправляем наш объект в nhibernate для сохранения. Мы используем:

.SaveOrUpdateAndFlush(user);

Это длительный процесс, и мы подумали, что он станет идеальным кандидатом для тестирования параллельных библиотек .NET 4.0. Итак, мы завернули цикл в:

Parallel.ForEach();

После этого мы начинаем получать «случайные» исключения тайм-аута от SQL Server, и, наконец, после того, как он оставался включенным всю ночь, OutOfMemory обрабатывал исключительные ситуации.

Я еще не провел глубокую отладку, но что вы, ребята, думаете. Это просто ограничение SQL Server, или это может быть наша установка NHibernate, или что?

ура

Энди

1 Ответ

3 голосов
/ 25 мая 2010

Parallel.ForEach не волшебство. Вы по-прежнему должны управлять единицами работы, пулами соединений и т. Д. С добавленной сложностью нескольких потоков. Кроме того, помните, что сеанс NHibernate не поточно-безопасный (каждый поток должен иметь свой собственный сеанс)

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

Исключения OutOfMemory, вероятно, связаны с утечками памяти; Вы, вероятно, оставляете свои сессии и сущности, болтающиеся вокруг. Вы должны использовать профилировщик, например ANTS или dotTrace , чтобы найти причину (у обоих есть бесплатные пробные версии)

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