|
|
|
Побайтное сравнение, 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>). Собственно вопрос - ОН ИХ ПОБАЙТНО СРАВНИВАЕТ? Как это отключить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2009, 17:15 |
|
||
|
Побайтное сравнение, NHibernate
|
|||
|---|---|---|---|
|
#18+
Raziel, Я, к сожалению уже не помню всех подробностей, а поднимать сейчас нет времени, извините. По-этому, попробую описать, что помню - остальное поищите сами. В общем, суть проблемы в том, что для того, чтобы сохранить граф сущностей NHibernate ищет изменившиеся (это вообще его больное место - такое у него отслеживание изменений. Microsoft, кстати, с этим пытается бороться в своей EF вводя специальные механизмы отслеживания изменений) - делать он, понятное дело может только сравнением того что было, с тем что стало. Для простых полей эти накладные - копейки, а вот для больши blob - да, проблема. Что тут можно сделать... (вот дальше уже наинаются пробелы, сорри): 1. Попробовать изменить режим сохранения. Помнится была возможность заставить сохранять всегда, без сравнения (правда это тоже не фонтан - сохранять всегда и все). Однако, я могу ошибаться и возможно это была возможность только для транзитных сущностей... Впрочем, тоже вариант - достать сущность, отсоединить, поменять, присоединить и сохранить. 2. Для проверки что сущность изменилась используется метод обнаружения Derty. Его можно переопределять. Но в разных версиях это несколько по-разному. В 1.2 это делалось написанием перехватчика и переопределением у него метода OnFlushDirty (вот только я не уверен, не будет ли NH все равно проверять сам на чистоту, если даже ваш метод вернет, что объект не изменился). В 2.x введен механизм событий, и есть специальное событие для проверки чистоты. Вот там, на сколько помню, можно вообще переопределить механизм проверки, но это несколько, хм ... нетривиально. А вообще, общая стратегия, которую мы для себя избрали - не работать с blob через NH - он это делает неоптимально (ну разве что оставить для совсем уж маленьких ~100 кб). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2009, 11:12 |
|
||
|
Побайтное сравнение, NHibernate
|
|||
|---|---|---|---|
|
#18+
Если используется <version> NH тоже производит сравнение ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2009, 16:46 |
|
||
|
Побайтное сравнение, NHibernate
|
|||
|---|---|---|---|
|
#18+
Dmitry Sukhovilin, Увы, не знаю - с версиями я никогда не работал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2009, 08:10 |
|
||
|
Побайтное сравнение, NHibernate
|
|||
|---|---|---|---|
|
#18+
Я сделал слегка по-другому. Указал на blob в маппинге mutable=false и он перестал сверять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 14:21 |
|
||
|
Побайтное сравнение, NHibernate
|
|||
|---|---|---|---|
|
#18+
А не перестал ли он его записывать? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 17:42 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36215513&tid=1351645]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
137ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 409ms |

| 0 / 0 |
