پایان Hibernate
از سری مقالات آموزش Java Enterprise, مباحث پایانی مرتبط با Hibernate را برمیگزینیم.
در این سری مقالات آموزش Hibernate سعی بر این شد تا مفاهیم کلی و ساختار Hibernate را بررسی کنیم. واضح است که متناسب با حجم تراکنش های پایگاه دادهای, مفاهیم مورد نیاز نیز تغییر میکند. اما در این سری مقالات مباحثی که در طی ایجاد پروژه ها بسیار رایج است را بررسی کردهایم. این مفاهیم در بعضی موارد بسیار پایه ای بودند و برای استفاده از آنها باید از تکنولوژی های دیگری کمک بگیریم تا بتوانیم کارایی سیستم را افزایش دهیم.
Caching
مبحث Caching در تمام تکنولوژی ها, برای افزایش کارایی است. در معماری کامپیوتر, پایگاه داده ها و هر مبحثی که با جابجایی داده ها سر و کار دارد, استفاده از caching یک راه متداول برای بهبود کارایی است. در Hibernate نیز این روش بسیار پرکاربرد است. Caching به مبحث کارایی برنامه مرتبط میشود و در میان برنامه و پایگاه داده قرار میگیرد. Caching کمک میکند تا دفعات مراجعه به پایگاه داده کاهش یابد.
Caching در سه سطح انجام میشود. سطح اول که Session Cache است, یک مسیر اجباری است که هر درخواست به پایگاه داده باید آن را طی کند. وقتی چندین بروز رسانی برای پایگاه داده ها داریم, Hibernate این بروز رسانی ها را تا حد ممکن به تاخیر میاندازد. به این ترتیب تعداد مراجعات به پایگاه داده کمتر میشود.
سطح اول Caching به صورت پیش فرض در Hibernate اعمال میشود و ناگزیر باید آن را پذیرا باشیم. اما برخلاف سطح اول, سطح دوم کاملا اختیاری است. زیرا اعمال Caching بر روی بعضی از کلاس ها, ممکن است از کارایی آن بکاهد. در این مرحله, ابتدا شیوه Caching مشخص و سپس مراحل Caching اعمال میشود. چهار روش Read only, Read-Write, Nonstrict-Read-Write و Transactional برای Caching در Hibernate استفاده میشوند. برای آشنایی با این روش ها میتوانید به اینجا مراجعه کنید.
سطح سوم Caching, در سطح Query است. در این سطح, نتایج Cache میشوند. این سطح از Caching برای درخواست های متناوبی که با پارامتر های یکسان تکرار میشوند کاربرد دارد. برای آشنایی با این نوع Caching میتوانید به اینجا مراجعه کنید.
Batch Processing
فرض کنید یک حجم زیادی از اطلاعات را میخواهیم به پایگاه داده اضافه کنیم. برای مثال میخواهیم حجم عظیمی از اطلاعات چندین کاربر را در یک حلقه تکرار به پایگاه داده وارد کنیم. Hibernate در سطح دوم, این object ها را cache میکند و با خطای
java.lang.OutOfMemoryError
مواجه میشویم. برای حل این چالش, از Batch Processing استفاده میکنیم. با استفاده از Batch Processing مشخص میکنیم که هر چند تعداد از object ها را به عنوان یک دسته در نظر بگیرد و ثبت کند. برای این منظور در hibernate.cfg.xml باید این property را وارد کنیم:
<property name="hibernate.jdbc.batch_size"> 40 </property>
در اینجا مشخص میشود که هر چهل سطر را به عنوان یک دسته در نظر بگیرد و ثبت کند. همچنین در کد ها باید مشخص کنیم که بعد از ثبت هر دسته, متد flush و clear را فراخوانی کند. فراخوانی این متد ها باعث میشود که اطلاعات در پایگاه داده ذخیره شوند و از نگهداری آنها در cache جلوگیری میکند. به این ترتیب دسته جدیدی میتواند وارد cache شود و دیگر مشکلی رخ نخواهد داد.
Interceptors
تا به اینجا انواع پردازش ها را بر روی اطلاعات درون پایگاه داده توسط Hibernate بررسی کردیم. اما میتوان برای وضعیت های گوناگون یک Object متد هایی را به عنوان callback تعیین کرد. برای این منظور از کلاس Entity Interceptor و یا Interceptor interface استفاده میشود. این interface شامل چندین متد است:
- find dirty : وقتی متد flush فراخوانی شود, فراخوانی میشود.
- instantiate : وقتی که یک کلاس در حالت استفاده قرار میگیرد, فراخوانی میشود.
- is unsaved : وقتی متد که object به متد save or update ارسال شود, فراخوانی میشود.
- on Delete : وقتی object از پایگاه داده حذف شود, فراخوانی میشود.
- on flush dirty : وقتی یک object را در حین flushing به عنوان dirty object تشخیص دهد, فراخوانی میشود.
- on Load : پیش از آنکه یک object در حالت initialize قرار گیرد, فراخوانی میشود.
- on Save : پیش از آنکه یک object در پایگاه داده ذخیره شود, فراخوانی می شود.
- post flush : بعد از اینکه عمل flush انجام شود و object در حافظه بروزرسانی شد, فراخوانی میشود.
- pre flush : پیش از آنکه بر روی یک object عمل flush انجام شود, فراخوانی میشود.
برای استفاده از هریک از این متد ها, نیاز است تا کلاسی که در آنها این interface را پیاده سازی میکنید, به عنوان متغیر ورودی به متد open session ارسال نمایید:
factory.openSession( new ZeroToHeroIterceptor() )
در اینجا سری مقالات Hibernate در Java Enterprise به پایان میرسد. در این سری مقالات سعی بر این شد تا با مفاهیم اصلی و پایه ای Hibernate آشنا شویم.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
از Java به Dart – کلاس و Constructor
آموزش Gradle – اهمیت Project Automation
تفاوت Sequence و List در کاتلین
بهترین محیط های توسعه(IDE) برای جاوا
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام من به یه مشکلی خوردم
من از ورژن hibernate 5.4.13 یعنی آخرین ورژن release شده استفاده میکنم بعد اصلا سطح اول cache برای من فعال نیست یعنی وقتی دوبار session.get فراخوانی میکنم دوبار دستور select انجام میشه میشه مشکلمو حل کنید ؟
سلام دوست عزیز. وقت بخیر.
first level cache به صورت پیش فرض فعال هست. اما کاری که شما میخواین انجام بدین مربوط به first level cache نمیشه. first level cache یک cache strategy هست که اعتبار یک object به session اون مرتبط هست و عملا این caching بین دوتا session قابل اشتراک نیست. کاری ک شما اینجا دارین انجام میدین این هست که از دو session متفاوت استفاده میکنید و به طبع نتیجه ای که مد نظر شماست برای شما تولید نمیشه. میتونید second level cache مطالعه بفرمایین ممکنه کاری که مدنظرتون هست رو براتون انجام بده