У меня было очень странное поведение, когда запросы NHibernate начали зависать. Я сделал демонстрационный проект, который демонстрирует это поведение повторяющимся образом.
Вы можете скачать проект здесь
Вот оскорбительный код:
public IList<Post> GetLatestLiveBlogEntries(int numEntriesToRetrieve)
{
var maxDate = DateTime.Now;
using (var session = SessionManager.OpenSession())
{
var crit = session.CreateCriteria(typeof (Post))
.Add(Restrictions.Eq("Enabled", true))
.Add(Restrictions.Lt("postDate", maxDate))
.AddOrder(new Order("postDate", false))
//.SetFetchMode("author", FetchMode.Eager) // <-- the exclusion of this line breaks everything!
.SetMaxResults(numEntriesToRetrieve);
StupidFileLogger.Log("If this is the last log, I'm hanging on crit.List<Post>()");
var listOfPosts = crit.List<Post>();
StupidFileLogger.Log("I actually was able to retrieve the posts");
return listOfPosts;
}
}
Ключевой строкой является .SetFetchMode в поле автора. При первой загрузке моего демонстрационного проекта он загружается нормально. Когда я нажимаю кнопку «Обновить», он зависает и никогда не проходит через вызов crit.List (). При активной загрузке работает постоянно.
Я использую Castle.Facilities.NHibernateIntegration.Components.SessionWebModule, чтобы обеспечить 1 сеанс на запрос.
Еще одна странная вещь, которую я обнаружил, - это то, что это происходит только с SQL Server. Когда я использую SQLite, все работает нормально. В моем демонстрационном проекте у меня есть простой флаг сборки, который позволяет легко переключать базы данных. Просто посмотрите файл local.properties.xml в каталоге / build.
Я понимаю, что в данном конкретном случае нетерпеливая загрузка решает мою проблему, но в моем приложении я не хочу, чтобы все загружалось с нетерпением.
Загрузите решение и попробуйте сами. Я пробовал это на других машинах, и они делают то же самое.
Вот несколько записей SQL Profiler. Вы можете видеть, что запрос сообщений был отправлен на сервер, но он останавливается на этом:
Первый запрос (ведет себя так, как ожидалось):
http://muc-central.com/misc/good_request.jpg
Второй запрос (зависает):