(linkedin) (delicious)

    .NET-transaktiot osa 2/3

    Tässä osassa tarkastellaan Microsoft:n COM+-palveluiden tarjoamaa tekniikkaa hallita tietokantojen transaction-käsittelyä. Aihetta tarkastellaan suurimmilta osin käytännön näkökulmasta katsottuna, jolloin selvitetään miten kyseinen tekniikka voidaan ottaa käyttöön omassa sovelluskoodissa. Tekniikkaa on tarkoitus tarkastella lisäksi hieman sovelluksen suorituskyvyn näkökulmasta katsottuna.

    Käsittelin aiemmassa .NET-transaktiot-blogikirjoituksessani kahta erilaista .NET:n tarjoamaa tapaa tietokannan transaction-käsittelyn hoitamiseksi. Tähän kirjoitukseen viitaten kirjoitin pienen oikaisun aiheeseen, koska huomasin, että asiat eivät tietenkään mene aivan niin yksiselitteisesti kuin ne lyhykäisyydessään esittelin. Oikaisun voit löytää kyseisen blogikirjoituksen lopusta.

    Sitten itse aiheeseen. Microsoft COM+-palvelut voidaan käsittää lyhyesti sanottuna kokoelmana komponentteja ja palveluita, joita voidaan hyödyntää esimerkiksi .NET-sovelluskehityksessä. COM+ on nimensä mukaisesti kehitysversio perinteisestä Microsoft:n COM-teknologiasta ( Component Object Model ). .NET-ympäristössä COM+-palveluihin päästään käsiksi kätevästi System.EnterpriseServices-nimiavaruuden kautta, jolloin palveluiden käyttöönottoa omassa projektissa edellyttää viittauksen asettaminen System.EnterpriseServices.dll-luokkakirjastoon. Viittauksen asettamisen lisäksi palveluiden käyttöönottoa edellyttää, että oma projektikokonaisuus on allekirjoitettu “vahvalla nimellä” ( strong key name ), sovellus on näkyvä COM-komponentteille ( COM Visible ) ja luokka on periytetty System.EnterpriseServices.ServicedComponent-luokasta.

    COM+-transaction-tekniikan avulla on mahdollista luoda automaattisen transaction-käsittelyn omaavia komponentteja, joiden toteuttamien toimintojen transaction-viitekehys voi ulottua “hajautetusti” esimerkiksi eri servereillä olevien tietokantojen välille, jolloin COM+ kommunikoi MSDTC:n ( Microsoft Distributed Transactions Coordinator ) kanssa transaction-käsittelyn toteuttamiseksi. Vaikka transaction-käsittely voidaan käsittää tässä tapauksessa täysin automaattisena, niin sitä voidaan kuitenkin hallita toimintaa ohjaavien transaction-attribuuttien avulla. Attribuuttia “Required” ( C# syntaksin mukainen lause kirjoitetaan luokkamäärityksen yläpuolelle: [Transaction(TransactionOption.Required)] ) voidaan pitää suositeltuna attribuuttina, mikäli halutaan varmistaa, että objektin metodeissa toteutetaan aina transaction-käsittely. Täydellisen automatisoinnin takaamiseksi luokan metodeihin tulee asettaa vielä “AutoComplete”-attribuutti, joka sijoitetaan kunkin metodin määrityksen yläpuolelle ( C# syntaksi: [AutoComplete(true)] ). Näin siis transaction-käsittely on hyväksytty automaattisesti, jos yksikään transaction-viitekehyksen sisällä oleva metodi ei heitä poikkeusta ( throw Exception ). Mikäli transaction-luokan metodille ei aseteta “AutoComplete”-attribuuttia, niin transaction-käsittely tulee joko hyväksyä tai peruuttaa eksplisiittisesti System.EnterpriseServices-nimiavaruudesta löytyvien staattisten metodien “ContextUtil.SetComplete” tai “ContextUtil.SetAbort” avulla. Seuraavasta linkistä voit tarkastella pientä koodiesimerkkiä, joka edustaa kuvitteellista “Henkilö”-luokkaa sovelluksen tietokantarajapinnassa. Tähän luokkaan on luotu automaattinen transaction-käsittely COM+-palveluiden avulla.

    C#: COM+-cHenkilot

    Kuten edellisestä esimerkistä voidaan huomata, niin kyseisellä tekniikalla on hyvin helppoa luoda korkean luotettavuuden omaavia tietokantakomponentteja, jolloin transaction-käsittelyn toteutus voidaan “ulkoistaa” COM+-palvelun hoiteisiin. Olen kuitenkin lukenut muutamia keskusteluja liittyen kyseisen tekniikan käyttöön ja olen saanut sen käsityksen, että palvelun käyttö lisäisi kohtuuttomasti sovelluksen suorituskykytarvetta. Tein siis pienen testiohjelman, joka päivittää identtisillä kyselyillä paikallisessa SQL Server -tietokannassa olevia tauluja “normaalin” SqlClient-DataProvider:n ja COM+-palvelun tarjoamien transaction-käsittelyiden avulla. Sovellus mittaa kyselyiden suorittamiseen kulunutta aikaa ja listaa kestot perinteiseen ListBox-komponenttiin. Tämän testiohjelman tulosten perusteella voidaan ainakin todeta, että kun COM+-kysely on suoritettu ensimmäisen kerran, niin seuraavien suorituskertojen kestot ovat melkolailla samaa luokkaa mitä normaalin transaction:n avulla tehdyt. Kunkin toiminnon ensimmäiset suorituskerrat eivät siis ole vertailukelpoisia, koska näissä tapauksissa täytyy ottaa huomioon .NET:n JIT-käännöksen (Just-In-Time) luonne, jolloin prosessorin suorittamaa “NativeCode”-konekieltä ei ole vielä luotu. Testin tuloksia voit tarkastella klikkaamalla allaolevasta kuvasta.


    Testin tulokset

    Testisovelluksen antamat toimintojen suoritusajat.

    aihe: dotNet

    “.NET-transaktiot osa 2/3” (Ei kommentteja)

    Kommentoi

    • (hymiot)Näytä Hymiöt
    •  

     
    | Takaisin ylös |
    Blogimoottori: WordPress
    Ulkoasu, Sisältö: © Timo Kallio, 2009-2012 - Savonia-ammattikorkeakoulu