Az ASP.NET, a LINQ és a Tranzakció

LINQ2SQL-t használunk ASP.NET projektben. A LINQ-hez tartozó DataContextet szerettük volna egy olyan változóban tárolni, ami több helyről is elérhető. Erre azért van szükség, mert ha tranzakcióban több műveletet hajtasz végre, akkor tanácsos csak egyetlen DataContext példányt használni (különben elosztott tranzakció indul, annak minden nyűgével). Egy dologra kell ilyenkor figyelni: a DataContext nem állapotmentes, úgyhogy nem szabad felhasználók között passzolgatni. Ebből következik, hogy nem lehet static...

Abból indultunk ki, hogy ASP.NET-ben minden kérést külön szál szolgál ki, tehát tegyük a DataContextet “szálanként statikussá” ([ThreadStatic]). Így elvileg minden kérésben egyedi lesz a [ThreadStatic] DataContextünk is. Ezzel nagyot lehet szívni, mert az ASP.NET újrahasználja a kiszolgáló szálakat, azaz egy kérés megörökölhetné egy korábbi független kérés [ThreadStatic] DataContextjét (lásd például ezt a bejegyzést).

Végül a legjobb megoldásnak az tűnt, hogy a DataContextet a HttpContext.Items-ben tároljuk el. Ez azért megfelelő, mert a Context.Items-ben tárolt értékek kérésenként egyediek, mégis az adott kérés során bárhonnan elérhetőek. A HttpContext.Items nem típusos tároló, így ajánlatos az ott tárolt DataContexthez típusos gettert készíteni:

public static DatabaseDataContext DatabaseDataContext
{
    get
    {
        if( HttpContext.Current.Items[ "DatabaseDataContext" ] == null )
            HttpContext.Current.Items[ "DatabaseDataContext" ] = new DatabaseDataContext();
        return ( DatabaseDataContext ) HttpContext.Current.Items[ "DatabaseDataContext" ];
    }
}


Dávid Zoltán

Dávid Zoltán Mérnök Informatikusként végeztem a BME-n, jelenleg webfejlesztéssel és gépi tanulással foglalkozom.

2009.03.20. 17:01:47 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • Jeffrey Snoverrel beszélgettem

    Balássy György (MS RD, ASP.NET MVP, MCTS) A TechEd kaliberű rendezvények egyik előnye, hogy az ember személyesen találkozhat azokkal, akik igazán közel vannak a tűzhöz. Ez persze nem minden téma esetén van így, mert vannak termékek, ahol az "evangélisták" tartják az előadásokat, de a kisebb csapatok esetén az előadók gyakran egyben a projekt szakmai agyai is. Tovább »
  • Amikor az UpdatePanel nem működik

    Dávid Zoltán Egyik webalkalmazás kezdőlapján több (három) lapozható lista is van. Mindegyiket LinkView-val valósítottuk meg. Felmerült az igény, hogy ezek a listák egymástól és az oldaltól függetlenül, aszinkron módon lapozhatóak legyenek. Elvileg erre való az UpdatePanel. Mindhárom listát be is burkoltam egy-egy UpdatePanelbe, ekkor jött a meglepetés: két lista szépen az UpdatePanelen belül lapozódott csak, míg a harmadik minden esetben teljes postbacket csinált és újratöltötte a teljes oldalt. Kicsit mérgelődtem és kattintgattam, ezalatt “elromlott” egy újabb lista is: így már kettőből csak egy volt hajlandó aszinkron újratöltődésre. Mindeközben a TFS-ben az oldalak ID-talanítása... Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások