
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
22.09.2009, 17:15
|
|||
|---|---|---|---|
Побайтное сравнение, NHibernate |
|||
|
#18+
Есть большая БД. В ней, в том числе, есть поле Data, тип byte[]. Маппинг вида "<property name="Data" type="BinaryBlob" length="2500000" />". Файлы от 100 кб до 10 мб. Программа, которая заносит в БД тестовые файлы (около 300) работает ОЧЕНЬ ДОЛГО. Я полез профайлером. Проседание производительности оказалось в методе Flash у сессии. Внутри оказалось, что почти 80% съедает метод NHibernate.Util.CollectionHelper.CollectionEquals<T>(ICollection<T>, ICollection<T>). Собственно вопрос - ОН ИХ ПОБАЙТНО СРАВНИВАЕТ? Как это отключить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2009, 11:12
|
|||
|---|---|---|---|
Побайтное сравнение, NHibernate |
|||
|
#18+
Raziel, Я, к сожалению уже не помню всех подробностей, а поднимать сейчас нет времени, извините. По-этому, попробую описать, что помню - остальное поищите сами. В общем, суть проблемы в том, что для того, чтобы сохранить граф сущностей NHibernate ищет изменившиеся (это вообще его больное место - такое у него отслеживание изменений. Microsoft, кстати, с этим пытается бороться в своей EF вводя специальные механизмы отслеживания изменений) - делать он, понятное дело может только сравнением того что было, с тем что стало. Для простых полей эти накладные - копейки, а вот для больши blob - да, проблема. Что тут можно сделать... (вот дальше уже наинаются пробелы, сорри): 1. Попробовать изменить режим сохранения. Помнится была возможность заставить сохранять всегда, без сравнения (правда это тоже не фонтан - сохранять всегда и все). Однако, я могу ошибаться и возможно это была возможность только для транзитных сущностей... Впрочем, тоже вариант - достать сущность, отсоединить, поменять, присоединить и сохранить. 2. Для проверки что сущность изменилась используется метод обнаружения Derty. Его можно переопределять. Но в разных версиях это несколько по-разному. В 1.2 это делалось написанием перехватчика и переопределением у него метода OnFlushDirty (вот только я не уверен, не будет ли NH все равно проверять сам на чистоту, если даже ваш метод вернет, что объект не изменился). В 2.x введен механизм событий, и есть специальное событие для проверки чистоты. Вот там, на сколько помню, можно вообще переопределить механизм проверки, но это несколько, хм ... нетривиально. А вообще, общая стратегия, которую мы для себя избрали - не работать с blob через NH - он это делает неоптимально (ну разве что оставить для совсем уж маленьких ~100 кб). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2009, 16:46
|
|||
|---|---|---|---|
|
|||
Побайтное сравнение, NHibernate |
|||
|
#18+
Если используется <version> NH тоже производит сравнение ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.09.2009, 08:10
|
|||
|---|---|---|---|
Побайтное сравнение, NHibernate |
|||
|
#18+
Dmitry Sukhovilin, Увы, не знаю - с версиями я никогда не работал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2009, 14:21
|
|||
|---|---|---|---|
Побайтное сравнение, NHibernate |
|||
|
#18+
Я сделал слегка по-другому. Указал на blob в маппинге mutable=false и он перестал сверять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2009, 17:42
|
|||
|---|---|---|---|
|
|||
Побайтное сравнение, NHibernate |
|||
|
#18+
А не перестал ли он его записывать? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=17&mobile=1&tid=1351645]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
24ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 368ms |

| 0 / 0 |
