如何设置超时NHibernate的LINQ声明(How to set timeout for NHi

2019-09-24 04:56发布

我使用功能NHibernate我的ORM。 在这方面,我想使用NHibernate的LINQ的语法与LINQ的权力来获取一组数据。 该代码我的作品和不同之处在于,如果时间超过大约30秒,运行的时间更长超时被抛出正确执行。 我的问题是我如何扩展默认为30秒超时为通过NHibernate的LINQ语句?

我已经看到了帖子在这里 , 在这里 ,并在这里 ,但前两个指设置的DataContext的超时属性,在这里不适用,第三是指设置在XML,这也并不适用超时,因为我使用连贯NHibernate到动态生成的XML。 不仅如此,但后为2岁,因为功能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语句无所谓)适用于除非发生超时所有目的。

任何帮助表示赞赏。 提前致谢!

Answer 1:

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);


Answer 2:

我结束了设定配置的功能NHibernate命令超时。 这样做的缺点是,它设置超时我所有的数据访问代码,而不仅仅是一个。

示例代码:

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

我发现从这个建议这个网站。



Answer 3:

我刚刚花这个战斗的时间相当,并希望这将节省别人一些时间。

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

将工作

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();

如果像第二(不工作)做例子,它似乎回落到默认System.Transaction.TransactionManager.DefaultTimeout。



文章来源: How to set timeout for NHibernate LINQ statement