如何为NHibernate LINQ语句设置超时

时间:2012-10-16 16:33:51

标签: c#-4.0 linq-to-nhibernate

我正在使用Fluent NHibernate作为我的ORM。在这样做的过程中,我尝试使用NHibernate LINQ语法以LINQ的强大功能获取一组数据。我已经正常工作并执行的代码,例外情况是,如果运行时间超过大约30秒,则会引发超时。我的问题是如何通过NHibernate扩展LINQ语句的默认30秒超时?

我已经看过帖子hereherehere,但前两个是指设置DataContext的Timeout属性,这里不适用,第三个引用在XML中设置超时,这也不适用,因为我正在使用Fluent NHibernate来动态生成XML。不仅如此,而且帖子已经2年了,而且Fluent NHibernate自那时起就发生了变化。

使用ICriteria对象甚至HQL,我可以指定超时,但这不是目标。我想知道如何设置相同的超时并使用LINQ。

示例代码:

    using (var session = SessionFactory.OpenSession())
    using (var transaction = session.BeginTransaction())
    {
        var query = (from mem in session.Query<Member>()
                     select mem);
        query = query.Where({where statement});
        int start = (currentPage - 1) * max);
        if (start > 0)
            query = query.Skip(start).Take(max);
        else
            query = query.Take(max);

        var list = query.ToList();
        transaction.Commit();
        return list;
    }

此代码(where语句无关紧要)适用于所有目的,除非发生超时。

感谢任何帮助。提前谢谢!

3 个答案:

答案 0 :(得分:12)

我最终为Configuration for Fluent NHibernate设置了命令超时。这样做的缺点是它为我的所有数据访问调用设置了超时,而不仅仅是那个。

示例代码:

.ExposeConfiguration(c => c.SetProperty("command_timeout", (TimeSpan.FromMinutes(10).TotalSeconds).ToString()))

我在this网站上找到了这个建议。

答案 1 :(得分:8)

Nhibernate扩展了IQueryable并添加了一些方法https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Linq/LinqExtensionMethods.cs

var query = (from c in Session.Query<Puppy>()).Timeout(12);

var query = (from c in Session.Query<Puppy>());

query.Timeout(456);

答案 2 :(得分:0)

我花了相当多的时间与此作斗争,希望这会在一段时间内拯救别人。

您应该在最后一刻使用.Timeout(120)方法调用以确保使用它。 TBH我不是百分之百确定为什么会这样,但这里有一些例子:

将继续工作

query = query.Where(x => x.Id = 123);

var result = query.Timeout(120).ToList();

不工作

query.Timeout(120);

query = query.Where(x => x.Id = 123);

var result = query.ToList();

如果像第二个(DOES NOT WORK)示例那样完成,它似乎回退到默认的System.Transaction.TransactionManager.DefaultTimeout。