我已经得到了一些非常奇怪的行为,其中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

第二请求(挂起):

替代文字http://muc-central.com/misc/hanging_request.jpg

有帮助吗?

解决方案 2

我通过切换到李林甫proxyfactory.factory_class固定的窍门。不知道为什么这个工程和青山没有。要了解更多有关动态代理,并找出我应该提交什么样的错误报告。

其他提示

好了,我认为这是一个Windows服务器上运行,所以我不知道相当于HTOP,但我敢打赌,你有一个僵局某处数据库/会话代码,你应该能够检查线程的状态,看是否每线程处于等待状态。

scroll top