কেন আপনি একটি ক্যোয়ারী ক্যাশে প্রয়োজন

আসুন HQL-এ কর্মচারীদের নিয়ে আমাদের উদাহরণটি আবার লিখি:

Employee director1 = session.createQuery("from Employee where id = 4").uniqueResult();
Employee director2 = session.createQuery("from Employee where id = 4").uniqueResult();

assertTrue(director1 != director2);

এই ধরনের প্রশ্নের ফলাফল প্রথম বা দ্বিতীয় স্তরের ক্যাশে দ্বারা সংরক্ষণ করা হয় না ।

এটি ঠিক যেখানে কোয়েরি ক্যাশে ব্যবহার করা যেতে পারে । এটি ডিফল্টরূপে নিষ্ক্রিয় করা হয়. এটি সক্ষম করতে, কনফিগারেশন ফাইলে নিম্নলিখিত লাইনটি যুক্ত করুন:

<property name="hibernate.cache.use_query_cache" value="true"/>

কিন্তু এটি মাত্র অর্ধেক সমাধান। আমরা ক্যোয়ারী ক্যাশে সক্রিয় করেছি, কিন্তু আমরা কোন ক্যোয়ারী ফলাফল ক্যাশে করতে চাই তাও আমাদের নির্দিষ্ট করতে হবে। এটি অবশ্যই ক্যোয়ারীতে লিখতে হবে:

Query query = session.createQuery("from Employee where id = 4");
query.setCacheable(true);
Employee director1 = query.uniqueResult();

ক্যোয়ারী ক্যাশে দ্বিতীয় স্তরের ক্যাশে অনুরূপ। কিন্তু, এটির বিপরীতে, এখানে ক্যাশে ডেটার কী বস্তু শনাক্তকারী নয়, কিন্তু ক্যোয়ারী প্যারামিটারের সেট। এবং ডেটা নিজেই সেই বস্তুর শনাক্তকারী যা কোয়েরির মানদণ্ডের সাথে মেলে। সুতরাং, দ্বিতীয় স্তরের ক্যাশের সাথে এই ক্যাশে ব্যবহার করা যুক্তিসঙ্গত।

ক্যাশে সাফ করা হচ্ছে

ক্যাশের সাথে কাজ করার সময় একটি গুরুত্বপূর্ণ কাজ হল নিশ্চিত করা যে ক্যাশে করা বস্তুগুলি পরিবর্তন করা যায় এবং সেগুলিকে ক্যাশে থেকে সরিয়ে দেওয়া (বা সেগুলি আপডেট)। হাইবারনেট এটি খুব ভাল করে। কখনও কখনও এমনও মনে হয় যে তিনি "কোনও বোধগম্য পরিস্থিতিতে ক্যাশে সাফ করুন" এই নিয়ম দ্বারা পরিচালিত হন।

ধরা যাক আপনি HQL এর মাধ্যমে ব্যবহারকারীর ডেটা আপডেট করতে চান:

Query query = session.createQuery("update Employee set name=’Alex’ where id = 4")
query. executeUpdate();

হাইবারনেট ডাটাবেসে ঠিক কী পরিবর্তন হয়েছে তা জানতে পারে না, তবে এটি জানে যে আপনি একটি কর্মচারী অবজেক্ট পরিবর্তন করছেন। অতএব, এই ক্যোয়ারীটি চালানোর পরে, হাইবারনেট এর ক্যাশে থেকে Employee টাইপের সমস্ত অবজেক্ট মুছে ফেলবে ।

কিন্তু NativeQuery আরও আকর্ষণীয় কাজ করে:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4")
nativeQuery.executeUpdate();

ডাটাবেসের একটি নেটিভ এসকিউএল কোয়েরি কার্যকর করা হয়েছে। এর মানে হল যে ডাটাবেসে কিছু পরিবর্তন হয়েছে - অনুরোধটি executeUpdate() পদ্ধতিতে বলা হয়েছিল । অতএব, এই ক্ষেত্রে, হাইবারনেট এটিকে নিরাপদে চালাবে এবং এর ক্যাশে থেকে সমস্ত ধরণের সমস্ত বস্তু সরিয়ে ফেলবে ।

আপনি যে কিভাবে পছন্দ করেন? আপনি একটি নিরীহ অনুরোধ কল করুন, এবং প্রতিক্রিয়া হিসাবে হাইবারনেট ক্যাশে থেকে সমস্ত ডেটা মুছে ফেলে! এটি অবশ্যই তার চেয়ে ভাল যদি সে এমন বস্তু রাখে যা বেস থেকে আলাদা, তবে এটাই!

অতএব, হাইবারনেটের নির্মাতারা দ্রুত এই ক্ষেত্রে হাইবারনেটকে কীভাবে সাহায্য করবেন তা বের করেছেন। ক্যাশে থেকে কোন সত্তার ধরনটি সরাতে হবে তা আপনি বলতে পারেন:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4");
nativeQuery.unwrap(org.hibernate.SQLQuery.class).addSynchronizedEntityClass(Employee.class);
nativeQuery.executeUpdate();
মন্তব্য . নেটিভ বাছাই করা প্রশ্নগুলি ক্যাশে ফ্লাশ করে না , শুধুমাত্র সন্নিবেশ করা, আপডেট করা, মুছে ফেলা, পদ্ধতি কল ইত্যাদি।

ম্যানুয়াল ক্যাশে ক্লিয়ারিং

নির্দিষ্ট কারণে, আপনি নিজেই ক্যাশে থেকে একটি বস্তু মুছে ফেলতে চাইতে পারেন। এটি বিভিন্ন উপায়ে করা যেতে পারে।

নোট _ ক্যাশে থাকা বস্তুগুলিকে অঞ্চল বলে গ্রুপে সংরক্ষণ করা হয় । ডিফল্টরূপে, অঞ্চলের নামটি ক্লাসের নামের মতোই। অতএব, আপনার যদি com.codegym.employee টাইপের অবজেক্ট থাকে , তাহলে সেগুলিকে “ com.codegym.employee ” নামে একটি গ্রুপে (অঞ্চল) সংরক্ষণ করা হবে।

আপনি যদি ক্যাশে অ্যাক্সেস করতে চান এবং এটির সাথে কিছু করতে চান তবে আপনি SessionFactory অবজেক্ট এবং getCache () পদ্ধতির সাথে এটি করতে পারেন :

session.getSessionFactory().getCache().evictQueryRegion("com.codegym.employee”);

আপনি যদি সমস্ত গ্রুপ (অঞ্চল) থেকে ডেটা মুছতে চান, তাহলে আপনাকে নিম্নলিখিত ক্যোয়ারী চালাতে হবে:

session.getSessionFactory().getCache().evictAllRegions();

ক্যাশে থেকে একটি বস্তু অপসারণ করতে, আপনাকে এর নাম (টাইপ) এবং আইডি পাস করতে হবে। আপনি এটি দুটি উপায়ে করতে পারেন:

session.getSessionFactory().getCache().evictEntityData("Employee, 4);

session.getSessionFactory().getCache().evictEntityData(com.codegym.Employee.class, 4);

আপনি একটি নির্দিষ্ট বস্তু ক্যাশে আছে কিনা তা পরীক্ষা করতে পারেন:

session.getSessionFactory().getCache().containsEntity("Employee, 4);
session.getSessionFactory().getCache().containsEntity(com.codegym.Employee.class, 4);