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);
     }
 
}

चांगली बातमी अशी आहे की आम्ही आमच्या पद्धती अशा प्रकारे लागू करू शकतो की आम्हाला डेटाबेसमधून अतिरिक्त डेटा लोड करण्याची आवश्यकता नाही. वाईट बातमी अशी आहे की आमच्या संग्रहांसह कार्य करणे सोपे नाही.