2012-10-16 12 views
12

Używam Fluent NHibernate dla mojej ORM. W ten sposób próbuję użyć składni NHINbernate LINQ do pobrania zestawu danych z mocą LINQ. Kod, który działam i działa poprawnie z tym wyjątkiem, że zostanie wygenerowany timeout, jeśli trwa dłużej niż około 30 sekund. Mam pytanie, w jaki sposób mogę przedłużyć domyślny 30-sekundowy limit czasu dla instrukcji LINQ za pośrednictwem NHibernate?Jak ustawić limit czasu dla oświadczenia NHibernate LINQ

już widział posty here, here i here ale pierwsze dwa odnoszą się do ustawiania właściwości Timeout DataContext, która nie ma tu zastosowania, a trzeci odnosi się do ustawienia limitu czasu w formacie XML, który również nie ma zastosowania ponieważ używam Fluent NHibernate do generowania XML w locie. Nie tylko to, ale post ma 2 lata i Fluent NHibernate zmienił się od tego czasu.

Dzięki obiektom ICriteria, a nawet HQL mogę określić limit czasu, jednak nie jest to celem tutaj. Chciałbym wiedzieć, jak ustawić ten sam limit czasu i użyć LINQ.

Przykładowy kod:

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

Ten kod (gdzie oświadczenie nie ma znaczenia) działa dla wszystkich celów z wyjątkiem gdy nastąpi przekroczenie limitu czasu.

Każda pomoc jest doceniana. Z góry dziękuję!

+0

Sprawdź odpowiedź przez kingpin2k. Sprawdziło się doskonale dla mnie. –

Odpowiedz

12

Zakończyłem ustawianie limitu czasu polecenia dla konfiguracji dla Fluent NHibernate. Wadą tego jest to, że ustawia limit czasu dla wszystkich moich połączeń dostępu do danych, a nie tylko jednego.

Przykładowy kod:

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

znalazłem tę sugestię z this internetowej.

+5

Powinieneś używać przestrzeni nazw NHibernate.Cfg.Environment podczas ustawiania właściwości NHibernate. W ten sposób, jeśli klucz się zmieni, nie utkniesz, zastępując tekst. Dla limitu czasu polecenia możesz wykonać następujące czynności zgodnie z sugestią Brandona, ale używając stałej: '.ExposeConfiguration (c => c.SetProperty (NHibernate.Cfg.Environment.CommandTimeout, TimeSpan.FromMinutes (5) .TotalSeconds.ToString()) ' –

+0

Próbowałem zrobić to samo.Nie działało.Tak nadal ma wartość domyślną 30s – Zuber

0

Spędziłem sporo czasu walcząc z tym i mam nadzieję, że to pozwoli zaoszczędzić kogoś innego niektóre czas.

Należy użyć wywołania metody .Timeout(120) w ostatniej chwili, aby upewnić się, że jest używany. TBH nie jestem w 100% pewien, dlaczego to jest, ale oto kilka przykładów:

BĘDZIE PRACOWAĆ

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

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

NIE DZIAŁA

query.Timeout(120); 

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

var result = query.ToList(); 

Jeśli wykonane jak drugi (robi” T WORK) przykład, wydaje się, że powraca do domyślnego System.Transaction.TransactionManager.DefaultTimeout.

+0

po tym, jak zapytanie zadziałało dla nas w $ work – Malcolm

+0

Zadowolony, gdy ktoś mi udowodni, że nie mam racji z odpowiednim testem, ale zrobiłem to ręcznie wiele razy i powielałem go za każdym razem.Zgadzam się, że będzie działać po zapytaniu, tak długo jak nie dodawaj dodatkowej klauzuli Where, a następnie wykonaj operację '.ToList();' –

+2

i myślę, że potrzebujesz zmienić przypisanie zmiennej jako query = query.Timeout (120); –

Powiązane problemy