Многопоточное управление сессиями NHibernate
У меня есть ситуация, когда несколько потоков одновременно заполняют базу данных данными, извлеченными из веб-источников. Скребки должны периодически запускаться для сбора новых данных из различных источников.
Я новичок в использовании NHibernate и не совсем уверен, как лучше управлять сессиями.
Пример того, что делает каждый работник:
- Очистить объект A из веб-источника
- Очистите каждую сущность B, связанную с A, и запишите, что A имеет другой B (то есть A имеет много B, a B имеет один A)
Чтобы сохранить каждый B, сеансу нужна ссылка на A для создания B, а затем A нужно добавить B в свой список дочерних элементов. И A, и B затем сохраняются.
Существует иерархия такого рода дочерних родительских ситуаций AB, что A имеет много B, B имеет много C... На уровне листьев A имеет тысячи конечных детей, поэтому нецелесообразно (?) Сохранять сеанс открыть весь путь вниз по этой цепочке.
Альтернативой является запись идентификатора каждого родителя по цепочке (который может быть сохранен независимо от сеанса) и загрузка в родительский элемент через этот идентификатор каждый раз, когда требуется создать дочерний элемент.
Я также понимаю, что ISession
должен быть однопоточным, поэтому мне понадобится как минимум один сеанс на поток, но кроме этого я действительно не уверен в лучшем подходе?
Любые идеи оценили, немного запутались на данный момент!
1 ответ
Создать сеанс для потока и использовать session.Load<>()
поддерживать ассоциацию без необходимости каждый раз загружать объекты.
var data = GetDataForBs();
using (var session = OpenSession())
using (var tx = session.BeginTransaction())
{
foreach (var item in data)
{
B = ... // create B
B.A = session.Load<A>(data.A_Id); // Creates a proxy without loading A to maintain the association
session.save(B);
}
tx.Commit();
}
Если каждая сущность живет сама по себе (не требует каскадирования), вы можете использовать StatelessSession вместо этого, чтобы ускорить процесс