সামঞ্জস্য কৌশল

আপনি হাইবারনেটে দ্বিতীয়-স্তরের ক্যাশিং সক্ষম করার পরে, আপনাকে হাইবারনেটকে ব্যাখ্যা করতে হবে যে আমরা কোন এন্টিটি অবজেক্টগুলিকে ক্যাশে করতে চাই এবং কীভাবে।

এটি করার জন্য, হাইবারনেটের সত্তা ক্লাসের জন্য একটি বিশেষ টীকা রয়েছে - @Cache । উদাহরণ:

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

এই টীকাটি প্রতিটি এন্টিটি সত্তার জন্য লিখতে হবে যার জন্য আমরা দ্বিতীয় স্তরের ক্যাশে ব্যবহার করতে চাই। উদাহরণ:

@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
    @Id
    private Integer id;
    private Set<Task> tasks;
}

হাইবারনেটের একটি ক্যাশে করা সত্তার জন্য 4টি সম্ভাব্য অ্যাক্সেস কৌশল রয়েছে যদি এটি বিভিন্ন থ্রেড থেকে অ্যাক্সেস করা হয়:

  • শুধুমাত্র পাঠযোগ্য
  • পড়া-লেখা
  • nonstrict-read-write
  • লেনদেন

শুধুমাত্র পড়া । একটি ডেটা-উপযুক্ত সঙ্গতি কৌশল যা কখনই পরিবর্তিত হয় না। হাইবারনেট কেবল এই বস্তুগুলিকে তার স্মৃতিতে সংরক্ষণ করবে। শুধুমাত্র রেফারেন্স ডেটার জন্য এটি ব্যবহার করুন।

ডাটাবেস অনেক তথ্য সঞ্চয় করে যা কখনো পরিবর্তিত হয় না। উদাহরণস্বরূপ, একটি টেবিল ইভেন্টগুলির একটি তালিকা রাখে যা শুধুমাত্র যোগ করা হয় কিন্তু পরিবর্তিত বা সরানো হয় না। আপনি যদি হাইবারনেটের মাধ্যমে এই টেবিলের সাথে কাজ করতে চান, তাহলে শুধুমাত্র-পঠন ক্যাশিং কৌশলটি আপনার জন্য উপযুক্ত হবে।

Read-write (পড়-লেখা)। প্রাথমিকভাবে পাঠযোগ্য ডেটার জন্য এই কৌশলটি ব্যবহার করুন। যাইহোক, হাইবারনেট এই ডেটা পরিবর্তন করার প্রচেষ্টা ট্র্যাক করবে, যদিও এটি আশা করে যে সেগুলি খুব কমই হবে।

আপনাকে প্রধানত সেই বস্তুগুলি ক্যাশে করতে হবে যা খুব কমই পরিবর্তিত হয় এবং প্রায়শই পড়া/অনুরোধ করা হয়। আপনার যদি এই ধরনের বস্তু থাকে, তাহলে আপনাকে তাদের জন্য পড়া-লেখার কৌশল ব্যবহার করতে হবে।

ননস্ট্রিক্ট-পড়ুন-লিখুন । এই কৌশলটি ক্যাশে এবং ডাটাবেসের মধ্যে সামঞ্জস্যের নিশ্চয়তা দেয় না। এই কৌশলটি ব্যবহার করুন যদি ডেটা প্রায় কখনই পরিবর্তিত না হয় এবং বাসি ডেটার একটি ছোট সম্ভাবনা একটি জটিল সমস্যা না হয়।

পঠন-লেখা কৌশলের বিপরীতে, এই কৌশলটি অনুমান করে যে পরিবর্তনযোগ্য ডেটা পড়ার জন্য লক করা নেই। এর ফলে বস্তুটি এক জায়গায় পরিবর্তিত হতে পারে, যখন অন্য জায়গায়, কেউ এটির পুরানো সংস্করণ পড়ছে।

উদাহরণস্বরূপ, একজন ব্যবহারকারী তার মন্তব্য পরিবর্তন করেছেন, কিন্তু অন্যান্য ব্যবহারকারীরা এখনও কিছু সময়ের জন্য তার পুরানো সংস্করণ দেখতে পাচ্ছেন। যদি এটি আপনার জন্য একটি সমস্যা না হয়, তাহলে অ-পঠন-লেখা কৌশলটি ব্যবহার করুন।

লেনদেনমূলক । প্রাথমিকভাবে শুধুমাত্র পঠনযোগ্য ডেটার জন্য এই কৌশলটি ব্যবহার করুন যেখানে একটি আপডেটের বিরল উপলক্ষ্যে সমকালীন লেনদেনে বাসি ডেটা প্রতিরোধ করা গুরুত্বপূর্ণ।

একটি ক্যাশে ডেটা সংরক্ষণ করা

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

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

1 -> { "Ivanov", 1, null , {1,2,5} }
2 -> { "Petrov", 2, null , {1,2,5} }
3 -> { "Sidorov", 3, null , {1,2,5} }

প্রতিটি বস্তু কত অতিরিক্ত মেমরি গ্রহণ করে তা বিবেচনা করে যা খুবই যুক্তিসঙ্গত।

উপরোক্ত ছাড়াও, আপনার মনে রাখা উচিত যে আপনার এন্টিটি ক্লাসের নির্ভরতাগুলিও ডিফল্টরূপে ক্যাশে করা হয় না। উদাহরণস্বরূপ, যদি আমরা উপরের শ্রেণীটি বিবেচনা করি, Employee , তারপর আনার সময়, কার্য সংগ্রহটি ডাটাবেস থেকে পুনরুদ্ধার করা হবে , দ্বিতীয়-স্তরের ক্যাশে থেকে নয়

আপনি যদি নির্ভরতাও ক্যাশে করতে চান তবে ক্লাসটি এইরকম হওয়া উচিত:

@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
    @Id
    private Integer id;

   @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
   private Set<Task> tasks;
}

এবং শেষ বিশদ - দ্বিতীয়-স্তরের ক্যাশে থেকে পড়া শুধুমাত্র তখনই ঘটে যখন পছন্দসই বস্তুটি প্রথম-স্তরের ক্যাশে পাওয়া যায় নি।

ক্যাশেমোড

হাইবারনেট খুব নমনীয় ক্যাশিং পরিচালনার জন্য অনুমতি দেয়। আপনি প্রতিটি পৃথক সেশনের জন্য বা এমনকি প্রতিটি ডাটাবেস অনুরোধের জন্য ক্যাশে মোড সেট করতে পারেন।

এই ধরনের পাঁচটি মোড আছে:

  • পাওয়া
  • উপেক্ষা করুন
  • স্বাভাবিক
  • PUT
  • রিফ্রেশ

নীচের টেবিল তাদের কাজ বর্ণনা করে:

ক্যাশেমোড বর্ণনা
পাওয়া ক্যাশে থেকে ডেটা পড়া হয় কিন্তু এতে যোগ করা হয় না।
উপেক্ষা করুন সেশনটি ক্যাশের সাথে ইন্টারঅ্যাক্ট করে না।
স্বাভাবিক ক্যাশে থেকে ডেটা পড়া হয় এবং এতে যোগ করা হয়।
PUT ডেটা কখনই ক্যাশে থেকে নেওয়া হয় না, তবে এতে যোগ করা হয়।
রিফ্রেশ ডেটা কখনই ক্যাশে থেকে নেওয়া হয় না, তবে এতে যোগ করা হয়। এই মোডে, hibernate.cache.use_minimal_puts সেটিং অতিরিক্ত ব্যবহার করা হয়।

একটি সেশনের জন্য ক্যাশে মোড সেট করার একটি উদাহরণ:

session.setCacheMode(CacheMode.GET);
Employee director = session.createQuery("from Employee where id = 4").uniqueResult();

এবং সেশন এবং অনুরোধের জন্য মোড সেট করার একটি উদাহরণ:

session.setCacheMode(CacheMode.GET);
Query query = session.createQuery("from Employee where id = 4");
query.setCacheMode(CacheMode.IGNORE); // Ignore cache work for this request
Employee director = query.uniqueResult();