|
|
|
NHibernate - оптимизация удаления больших графов объектов
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Имеется приложение, которое NHibernate-ом сохраняет в базу большие графы объектов (очень большие, база уже достигла 10 Гб). Всё работает отлично. Теперь появилась потребность удалять большие "графы" объектов из базы. Каждый раз, когда NHibernate хочет удалить объект, он его загружает на клиента. Впринципе, такое его намерение хорошее, он ведь должен выстроить в памяти сплетение зависимых друг от друга объектов и запомнить их идентификаторы перед удалением. Только проблема в том, что на клиента грузятся абсолютно все поля объектов (не только Id, но и много чего другого (Name, Description, Price, ....), фактически не участвующего в процессе удаления данных). Чтобы разрешить эту проблему, я сделал второй "набор" маппингов, в которых замапил только свойства Id и связи "many-to-one" и "bag". Жить стало веселее, теперь удаление самого большого графа длится всего минут 40, вполне сносно. Теперь вопрос: Возможно ли реализовать частичную загрузку объектов (только Id и их связи друг с другом) для удаления с помощью тех же полных маппингов, которыми я пользовался для сохранения/обновления всей информации в базу? Чтобы не иметь 2 набора маппингов (один для сохранения, другой для удаления объектов), а пользоваться только одним, с информацией о всех отображаемых на базу полях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2010, 20:52 |
|
||
|
NHibernate - оптимизация удаления больших графов объектов
|
|||
|---|---|---|---|
|
#18+
Pregamil Теперь вопрос: Возможно ли реализовать частичную загрузку объектов (только Id и их связи друг с другом) для удаления с помощью тех же полных маппингов, которыми я пользовался для сохранения/обновления всей информации в базу? Чтобы не иметь 2 набора маппингов (один для сохранения, другой для удаления объектов), а пользоваться только одним, с информацией о всех отображаемых на базу полях? Pregamil, теперь ответ: оба хуже. NHibernate предназначена для удобства создания кода в стиле DDD, дабы избавится от инфраструктурного кода для поддержки сохраняемости. Для массовых операций лучше использовать чистый SQL или хранимые процедуры. P.S. Есть еще IStatelessSession. Как видно, она не хранит информацию об объектах, поэтому может выполнятся быстрее. Но это всё равно плохой совет, SQL ждёт вас :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2010, 21:09 |
|
||
|
NHibernate - оптимизация удаления больших графов объектов
|
|||
|---|---|---|---|
|
#18+
Я уже думал реализовать на чистом SQL, но слишком много запоминающихся объектов и связей между ними, руками это реализовывать было бы слишком долго. SolYUtor Есть еще IStatelessSession Спасибо, буду копать в эту сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2010, 22:08 |
|
||
|
NHibernate - оптимизация удаления больших графов объектов
|
|||
|---|---|---|---|
|
#18+
Pregamil, А что из себя представляет граф объектов? Если это какое-то большое дерево - то можно хранить Id корня в каждой ветви, и удалять по ней. Это будет на несколько порядков быстрее, нежели удалять их через NHibernate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2010, 10:06 |
|
||
|
NHibernate - оптимизация удаления больших графов объектов
|
|||
|---|---|---|---|
|
#18+
Древовидные категории / продукты / и куча параметров продуктов (которые входят в отношения друг с другом и с продуктами один-ко-многим и многие-ко-многим). Как я удаляю. Сначала говорю, NHibernate, чтобы он разорвал ненужные связи продуктов с ихними параметрами (параметры могут жить дольше, чем сами продукты, и тут NHibernate должен сначала сделать выборку продуктов, относящихся к базовой удаляемой категории, а категорий имеют несколько уровней вложенности), а потом говорю NHibernate, чтобы он удалил категорию, он удаляет ее и все зависимости каскадно. Потом отдельно проход по базе для удаления некоторых полей в базе, на которые нет ссылок. SolYUtorЕсли это какое-то большое дерево - то можно хранить Id корня в каждой ветви, и удалять по ней Речь идет о том, чтобы настроить каскады в базе и удалять хранимой процедурой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2010, 14:52 |
|
||
|
NHibernate - оптимизация удаления больших графов объектов
|
|||
|---|---|---|---|
|
#18+
Pregamil Речь идет о том, чтобы настроить каскады в базе и удалять хранимой процедурой? Можно и так, но я не уверен, что это хорошая идея. :) Ибо каскады напрямую не следуют из кода, поэтому для будущих поколений могут быть сюрпризы. Но в одной из задач приходилось довольно часто искать корень дерева начиная с далёкой от корня ветви. В таком случае Можно добавить в каждую категорию ссылку на корневую категорию, и быстро по ней переходить, миную вытаскивание полного графа объектов. Всё это недолго накодить на C# и сделать соответствующий маппинг для NHibernate. Если применить И тогда в ваше удаление можно сделать в три delete (код на уровне идеи, ибо писал сразу на форум): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. При таком раскладе удаление будет происходить на несколько порядков быстрее, нежели через NHibernate. Это особенно важно, если удаление заворачивать в транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2010, 10:06 |
|
||
|
NHibernate - оптимизация удаления больших графов объектов
|
|||
|---|---|---|---|
|
#18+
Рекомендую ознакомиться вот с этим , а там, глядишь, и старые маппинги вполне устроят ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2010, 12:42 |
|
||
|
|

start [/forum/topic.php?fid=17&gotonew=1&tid=1351210]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
6ms |
get first new msg: |
3ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 439ms |

| 0 / 0 |
