Soci (Soczó Zsolt) szakmai blogja

2012.03.31.

NHibernate futures

Filed under: .NET,Adatbázisok,ADO.NET,Entity Framework,NHibernate,Szakmai élet — Soczó Zsolt @ 16:59

Korábban írtam, hogy a Future query-k milyen jók, mivel ha tudjuk, hogy sok lekérdezést egymás után akarunk végrehajtani, akkor össze lehet őket rakni egy batchbe, ezzel igen jelentős gyorsulást lehet elérni. Álljon itt egy konkrét példa:

private IQueryable LoadTradeStatisticsQueryable(ISession session, TaConfig config, TradeDirection dir)
{
return from ts in session.Query()
where ts.TaConfig == config && ts.Dir == dir
select ts;
}

public Dictionary> LoadTradeStatisticsBulk(TradeDirection dir, IEnumerable taSubPortfolios)
{
var futures = new Dictionary>();
using (var session = AtsNHibSessionFactory.Factory.OpenSession())
{
foreach (var taSubPortfolio in taSubPortfolios)
{
futures.Add(taSubPortfolio, LoadTradeStatisticsQueryable(session, taSubPortfolio.TaConfig, dir).ToFuture());
}
foreach (TaSubPortfolio p in futures.Keys.ToList())
{
futures[p] = futures[p].ToList();
}
}

return futures;
}

A trükk egyszerű. A lekérdezéseket nem hajtjuk végre, hanem a Queryable-öket a ToFuture segítségével betárazzuk későbbre. Aztán mikor mind megvan, a ToList()-tel kikényszerítjük az IQueryable-ök végrehajtását. A poén az, hogy ilyenkor az NHib tudja, hogy ezek future query-k, így a 2. ciklus első iterációjakor egyszerre kiadja az összes lekérdezést, így a ciklus 2..n. iterációjában már csak kivesszük az eredményeket.
Az adatbázisba ez sok-sok selectként megy be egy batchben, majd a több resultsetből az NHib szépen materializálja az entitásokat.
Sokszoros sebességnövekedést lehet elérni csak ezzel az egyszerű trükkel. Ez nem csak homogén lekérdezésekre megy, tetszőlegeseket össze lehet rakni így egybe.
EF-hez itt van hasonló kiegészítés.

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress