Lazy Loading

kasedhiya

1.1 Latar mburi masalah

Nalika sampeyan miwiti nggarap database nyata, sampeyan bakal langsung ngelingi tembung "optimasi durung wayahe minangka oyod saka kabeh piala." Mung saiki sampeyan ngelingi dheweke kanthi cara sing negatif. Nalika nggarap database, optimasi penting banget. Lan sampeyan kudu nggarap iku wis ing tataran desain.

Hibernate ndadekake nggarap database trep banget. Sampeyan bisa gampang njaluk sembarang obyek anak mung kanthi bener annotating @OneToManylan @ManyToMany. Tuladha:

@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL)
   @JoinColumn(name = "user_id")
   public List<Comment> comments;
}

Lan carane gampang kanggo njaluk komentar pangguna:

User user = session.get(User.class, 1);
List<Comment> comments = user.getComments();

Lan sampeyan bakal dadi kejutan gedhe. Pangguna duwe sawetara ewu komentar. Yen sampeyan nulis kode kaya iki, Hibernate mesthi bakal mbukak kabeh komentar pangguna. Nanging bakal alon banget, komentar bakal njupuk akeh memori lan liya-liyane.

Mulane sampeyan ora bisa nulis kaya ngono! Ing teori, ya, nanging ing praktik, ora.

1.2 Nggawe luwih elek karo koleksi

Masalahe malah luwih menarik. Sawise kabeh, biasane sampeyan ora butuh kabeh komentar pangguna. Sanajan sampeyan nampilake ing endi wae ing klien, sampeyan luwih seneng nindakake ing bagean - kaca.

Dadi sampeyan butuh cara kaya iki:

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

}

Cara pisanan ngasilake mung siji kaca komentar - 50 potongan. Cara kapindho ngasilake jumlah kaca komentar. Lan iki sing paling awon. Kanggo ngerteni jumlah komentar, sampeyan kudu ndownload kabeh komentar saka database!

1.3 Cahya ing mburi trowongan

Mulane, ora ana sing nggunakake koleksi anak sing apik banget. Ora, mesthine digunakake, nanging mung minangka bagean saka pitakon HQL. Contone kaya iki:

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

}

Kabar apik yaiku kita bisa ngleksanakake metode kanthi cara sing ora perlu mbukak data ekstra saka database. Kabar ala yaiku ora gampang nggarap koleksi kita.

Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar