Текущий случай довольно сложный, но я могу от него избавиться. У меня есть объекты 300k (или больше, число только для статистики) в ConcurrentQueue <>, и эти объекты готовы к хранению в базе данных. Im использованием нескольких потоков, чтобы сделать запись в database.Every нить делает следующее, пока очередь не пуста:Хранение объектов async с NHibernate, Тесты производительности
- если можно из очереди
- взять объект
- открыть сеанс
- открыт транзакция
- сохраняются объекту
- фиксации транзакции
- закрыть сеанс
- перейти к 1.
После некоторого тестирования приведены результаты
- 2 нити persits 300 тыс объектов для 00: 00: 49,4008256 averege время
- 4 потока persits 300 тыс объектов для 00:00: 29.6146939 averege время
- 10 нитей persits 300 тыс объектов для 00: 00: 24.0903779 averege время
- 20 нитей persits 300 тыс объектов для 00: 00: 19.7451293 averege время
- 40 нитей persits 300 тыс объектов для 00: 00: 18,2760453 averege время
И здесь идет мои вопросы:
[1] Почему, когда я удвоение числа потоков времени выполнения не два раза снизилась?
[2] И все равно можно улучшить это, не увеличивая количество объектов в транзакции.
Я использую NHibernate с MSSQL 2012.
Надеюсь, это не настоящая 'goto'! – weston
lol, no im using while (toBePersisted.TryDequeue (out obj)) –
Простой ответ не использует NHibernate для этой задачи. Вы можете ускорить сеанс без сохранения состояния, но я бы использовал правильный инструмент для работы. Что-то вроде SQLBulkCopy http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx – Rippo