12

ORMにFluentNHibernateを使用しています。そうすることで、NHibernate LINQ構文を使用して、LINQの機能を備えたデータセットをフェッチしようとしています。私が持っているコードは、実行に約30秒以上かかる場合にタイムアウトがスローされることを除いて、正しく機能して実行されます。私が持っている質問は、NHibernateを介してLINQステートメントのデフォルトの30秒のタイムアウトをどのように延長するかです。

ここここ、およびここでの投稿はすでに見ましたが、最初の2つは、ここでは適用されないDataContextのTimeoutプロパティの設定を参照し、3つ目は、XMLでのタイムアウトの設定を参照しています。これも、使用しているため適用されません。その場でXMLを生成するための流暢なNHibernate。それだけでなく、ポストは2歳で、FluentNHibernateはそれ以来変わっています。

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

このコード(ステートメントは重要ではありません)は、タイムアウトが発生する場合を除いて、すべての目的で機能します。

どんな助けでも大歓迎です。前もって感謝します!

4

3 に答える 3

13

FluentNHibernateの構成のコマンドタイムアウトを設定することになりました。これの欠点は、1つだけでなく、すべてのデータアクセス呼び出しのタイムアウトを設定することです。

コード例:

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

2番目の(動作しない)例のように実行すると、デフォルトのSystem.Transaction.TransactionManager.DefaultTimeoutにフォールバックするように見えます。

于 2016-01-21T08:20:28.813 に答える