1.1 সমস্যার পটভূমি
আপনি যখন বাস্তব ডাটাবেস নিয়ে কাজ শুরু করবেন, আপনি অবিলম্বে এই বাক্যাংশটি মনে রাখবেন "অকাল অপ্টিমাইজেশান সমস্ত মন্দের মূল।" শুধু এখন আপনি তাকে নেতিবাচকভাবে মনে রাখবেন। একটি ডাটাবেসের সাথে কাজ করার সময়, অপ্টিমাইজেশন অপরিহার্য। এবং আপনি ইতিমধ্যে নকশা পর্যায়ে এটির সাথে কাজ করতে হবে।
হাইবারনেট ডাটাবেসের সাথে কাজ করা খুব সুবিধাজনক করে তোলে। আপনি সহজেই সঠিকভাবে টীকা দিয়ে যেকোনো শিশু বস্তু পেতে পারেন @OneToMany
এবং @ManyToMany
. উদাহরণ:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
public List<Comment> comments;
}
এবং ব্যবহারকারীর মন্তব্য পাওয়া কতটা সহজ:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments();
এবং আপনি একটি বড় চমক জন্য হবে. ব্যবহারকারীর কয়েক হাজার মন্তব্য আছে। আপনি যদি এইরকম কোড লেখেন, হাইবারনেট অবশ্যই ব্যবহারকারীর সমস্ত মন্তব্য লোড করবে। তবে এটি খুব ধীর হবে, মন্তব্যগুলি অনেক স্মৃতি গ্রহণ করবে ইত্যাদি।
সেজন্য তুমি এমন লিখতে পারো না! তত্ত্বে, হ্যাঁ, কিন্তু অনুশীলনে, না।
1.2 সংগ্রহের সাথে জিনিসগুলি আরও খারাপ করা
সমস্যাটি আরও আকর্ষণীয়। সর্বোপরি, সাধারণত আপনার কখনই সমস্ত ব্যবহারকারীর মন্তব্যের প্রয়োজন হয় না। এমনকি যদি আপনি সেগুলিকে ক্লায়েন্টে কোথাও প্রদর্শন করেন তবে আপনি এটি অংশে - পৃষ্ঠাগুলিতে করতে পছন্দ করেন।
সুতরাং আপনি এই মত পদ্ধতি প্রয়োজন:
public class CommentsManager {
private static final PAGE_SIZE = 50;
public List<Comment> getCommentsPage(int userId, int pageIndex){
User user = session.get(User.class, userId);
List<Comment> comments = user.getComments();
return comments.subList(pageIndex * PAGE_SIZE, PAGE_SIZE);
}
public int getCommentsPageCount(int userId) {
User user = session.get(User.class, userId);
List<Comment> comments = user.getComments();
return Math.ceil( comments.size()/PAGE_SIZE);
}
}
প্রথম পদ্ধতিটি শুধুমাত্র এক পৃষ্ঠার মন্তব্য প্রদান করে - 50 টুকরা। দ্বিতীয় পদ্ধতিটি মন্তব্যের পৃষ্ঠার সংখ্যা প্রদান করে। এবং এটি সবচেয়ে খারাপ। সহজভাবে মন্তব্যের সংখ্যা খুঁজে বের করার জন্য, আপনাকে ডাটাবেস থেকে সমস্ত মন্তব্য ডাউনলোড করতে হয়েছিল!
1.3 টানেলের শেষে আলো
অতএব, কেউ আমাদের বিস্ময়কর শিশু সংগ্রহ ব্যবহার করে না। না, অবশ্যই তারা ব্যবহার করা হয়, কিন্তু শুধুমাত্র HQL প্রশ্নের অংশ হিসাবে। যেমন এই মত:
public class CommentsManager {
private static final PAGE_SIZE = 50;
public List<Comment> getCommentsPage(int userId, int pageIndex){
String hql = "select comments from User where id = :id";
Query<Comment> query = session.createQuery( hql, Comment.class);
query.setParametr("id", userId);
query.setOffset(pageIndex * PAGE_SIZE);
query.setLimit(PAGE_SIZE);
return query.list();
}
public int getCommentsPageCount(int userId) {
String hql = "select count(comments) from User where id = :id";
Query<Integer> query = session.createQuery( hql, Integer.class);
query.setParametr("id", userId);
return Math.ceil(query.singleResult()/PAGE_SIZE);
}
}
ভাল খবর হল যে আমরা আমাদের পদ্ধতিগুলিকে এমনভাবে প্রয়োগ করতে পারি যাতে আমাদের ডাটাবেস থেকে অতিরিক্ত ডেটা লোড করার প্রয়োজন হয় না। খারাপ খবর হল আমাদের সংগ্রহের সাথে কাজ করা সহজ নয়।