NHibernate ja one-to-one

20.05.2007  |  Gunnar

Maadlesin hiljuti ühe ASP.NET ja NHibernate peal ehitatud süsteemi jõudluse probleemidega, kus sattusin veidra nähtuse otsa. Nimelt kasutaja objekti laadimine, mis on pealtnäha lihtne asi, võttis aega kuni neli sekundit.

Kood ise oli lihtne. Pöördumise alguses loetakse sessioonist kasutaja ID ja laetakse andmebaasist sellele vastav kasutaja objekt. Kasutaja objekt paigutatakse käesolevasse HttpContext-i instatsi, et seda rohkem andmebaasist lugema ei peaks sama pöördumise jooksul.

Probleemi tuvastamiseks süvenesin NHibernate-i logidesse ja leidsin sealt üllatuseks, et peale kasutaja ja sellega one-to-one seoses oleva füüsilise isiku laetakse isik veel teist korda samas päringus ning veel terve rida objekte. Muuhulgas täideti ära kollektsioonid, mille kohta on konfiguratsioonis määratud lazy loading.

Vaja oli andmebaasist midagi sellist:

  • füüsiline isik
    • kasutaja

kuid tulemuseks oli:

  • füüsiline isik
    • kasutaja
      • füüsiline isik
        • isiku seosed
          • seotud isikud

Kogu probleem taandus sellele, et füüsilise isiku ja kasutaja vahel on defineeritud one-to-one seos. Selle seose esimese otsaga sai NHibernate korralikult hakkama. Teine pool sellest seosest, mis viib kasutaja juurest tagasi isiku juurde, ajas aga NHibernate-i totaalselt sassi.

Lahendus probleemile on lihtne - omistan isiku ja kasutaja klasside definitsioonis lazy-atribuudi väärtuseks tõese ning nüüd võtab kasutaja objekti laadimine aega murdosa sekundist. Tekkinud probleemi ning toimivat lahendust kirjeldab põhjalikumalt Oren Eini oma blogi kandes NHibernate one-to-one.

Üks kommentaar sissekandele “NHibernate ja one-to-one”

  1. arendaja

    Mitte ei õnnestu one-to-one seost lazy -ks teha.
    Äkki paned näite mõlema klassi mapingust?

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress