‫مشکل Stack Overflow در NHibernate

به تجربه دریافته‌ام هر وقت که در NHibernate/Castle AR بدون هیچ دلیل واضحی مشکل Stack Overflow به وجود می‌آید، باید مکانیزم Dirty detection را بررسی کرد. در این مکانیزم، NH خودش objectهایی را که dirty شده‌اند را پیدا کرده و آنها را update می‌کند.

بعضی وقت‌ها پیش می‌آید که update شدن یک آبجکت dirty باعث dirty شدن یک جای دیگر شده و آن هم به نوبه خودش نیاز به update پیدا کرده و این زنجیره آنقدر ادامه پیدا کرده که برنامه در loop افتاده و در اثر Stack Overflow از کار می‌افتد. البته مشکل همیشه دقیقاً به همین حالت نیست اما علت خطا کم و بیش همین است.

به عنوان مثال فرض کنید که برای به روز رسانی یک entity نیاز دارید به دیتابیس مراجعه کرده و چیزی را در آنجا چک کنید. با اولین مراجعه به دیتابیس، NH اول به طور خودکار session را flush کرده و بعد از آن اطلاعات را از دیتابیس فراخوانی می‌کند. اما به هنگام flush شدن، entity مورد نظر ما هنوز dirty است و نیاز به ذخیره در دیتابیس دارد. این روال باعث به روز رسانی زنجیره‌ای entity شده و در نهایت باعث بروز stack overflow می‌گردد.

یکی از راه حل‌های رفع این مشکل استفاده از sessionهای مستقل از هم است. چون dirty checking هر sessionی مستقل از sessionهای دیگر است. در Castle AR می‌توان از روشی مشابه زیر استفاده کرد:

using (new SessionScope())
{
//do something with this separate session
}
پ.ن.: به این لینک هم نگاهی کنید.

First level cache in Castle ActiveRecord

While I was trying to use first level cache in a Castle ActiveRecord based application I found some points that like to share:

1. First level cache is alive within a single session (NHibernate’s ISession) only.

2. First level cache is enabled by default and can not be disabled.

3. If you don’t use SessionScope properly you may have more than one session per ASP.NET web request. So you will not profit from first level cache. SessionScope is Castle ActiveRecord’s way for NHibernate’s ISession. Correct way to use SessionScopt in an ASP.NET web application is to use SessionScopeWebModule as a httpModule. More info could be found here.

4. First level cache can be used only by NHibernate Load and Get methods. So with Castle ActiveRecord you can only use Find and TryFind method. FindAll and other methods can not benefit from first level cache because they use ICriteria internally.

More info about NHibernate caching is available here.

جلسات ناهاری

یکی از معضلات همیشگی شرکت‌های نرم‌افزاری کمبود وقت برای آموزش و اطلاع‌رسانی است. یکی از راهکارهای مورد استفاده در کشورهای پیشرفته‌تر استفاده از «جلسات ناهاری» یا به قول خودشان Brown Bag Session است.

این طور جلسات به طور غیر رسمی و به منظور آموزش یا اطلاع‌رسانی درباره‌ی یک موضوع خاص برگزار می‌شود. این جلسات در وقت ناهار برگزار می‌شود. یعنی در واقع برگزار برگزار کننده‌ی جلسه حین ناهار خوردن شرکت کنندگان به آنها ملحق شده و ضمن صرف ناهار با آنها جلسه را هم برگزار می‌کند. این طور جلسات زمانی در حد یک الی دو ساعت داشته و معمولاً برای جلساتی که نیاز به بحث و گفتگو دارند مناسب است.

دلیل نام گذاری این جلسات به Brown Bag این است که معمولاً افراد (کشورهای موصوف) ناهارشان را در پاکت‌های قهوه‌ای رنگ می‌گذارند و این پاکت‌ها را با خود به جلسه می‌آورند.