12

我正在为我的 ORM 使用 Fluent NHibernate。在这样做时,我试图使用 NHibernate LINQ 语法来获取一组具有 LINQ 功能的数据。我的代码可以正常工作并正确执行,但如果运行时间超过大约 30 秒,则会引发超时。我的问题是如何通过 NHibernate 延长 LINQ 语句的默认 30 秒超时?

我已经看过这里这里这里的帖子,但是前两个是指设置 DataContext 的 Timeout 属性,此处不适用,第三个是指在 XML 中设置超时,这也不适用,因为我正在使用流畅的 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 语句无关紧要)适用于所有目的,除非发生超时。

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

4

3 回答 3

13

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

示例代码:

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

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

于 2012-10-18T14:15:11.980 回答
9

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);
于 2014-01-03T03:31:30.403 回答
0

我刚刚花了相当多的时间来解决这个问题,希望这可以为其他人节省一些时间。

您应该.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。

于 2016-01-21T08:20:28.813 回答