当实体存在懒物业NHibernate的criteria.List()挂起
-
22-07-2019 - |
题
我已经得到了一些非常奇怪的行为,其中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一切工作正常。在我的演示项目中,我有一个简单的构建标记允许你切换分贝的轻松。只要看看在/ build目录local.properties.xml。
据我所知,渴望装载解决了我的问题,在这种特殊情况下,但在我的应用程序,我不希望有热心负载的一切。
请下载解决方案,并亲自尝试一下。我已经尝试过在其他机器上,他们做同样的事情。
下面是一些SQL探查捕获。你可以看到,对于帖子的查询被发送到服务器,但它停在那里:
第一请求(按预期运行):
良好请求http://muc-central.com/misc/good_request.jpg一>
第二请求(挂起):
解决方案 2
我通过切换到李林甫proxyfactory.factory_class固定的窍门。不知道为什么这个工程和青山没有。要了解更多有关动态代理,并找出我应该提交什么样的错误报告。
其他提示
好了,我认为这是一个Windows服务器上运行,所以我不知道相当于HTOP,但我敢打赌,你有一个僵局某处数据库/会话代码,你应该能够检查线程的状态,看是否每线程处于等待状态。