Многопотоковое управление сессиями NHibernate - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть ситуация, когда несколько потоков одновременно заполняют базу данных данными, извлеченными из веб-источников. Скребки должны периодически запускаться для сбора новых данных из различных источников.

Я новичок в использовании NHibernate и не совсем уверен, как лучше управлять сессиями.

Пример того, что делает каждый работник:

  • Очистить сущность A из веб-источника
  • Очистите каждую сущность B, связанную с A, и запишите, что A имеет другой B (то есть A имеет много B, B имеет один A)

Чтобы сохранить каждый B, сеансу нужна ссылка на A для создания B, а затем A необходимо добавить B в свой список детей. И A, и B сохраняются.

Существует иерархия такого рода дочерних родительских ситуаций AB, что A имеет много B, B имеет много C ... На уровне листьев A имеет тысячи конечных детей, поэтому нецелесообразно (?) держать сессию открытой до конца этой цепочки.

Альтернативой является запись идентификатора каждого родителя по цепочке (который может храниться независимо от сеанса) и загрузка в родительский элемент через этот идентификатор каждый раз, когда требуется создать дочерний элемент.

Я также понимаю, что ISession должен быть однопоточным, поэтому мне понадобится как минимум один сеанс на поток, но кроме этого я действительно не уверен в лучшем подходе?

Любые идеи оценены, немного запутаны в данный момент!

1 Ответ

0 голосов
/ 08 декабря 2011

создайте сеанс для каждого потока и используйте 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 вместо этого, чтобы ускорить процесс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...