12/08/2018, 16:47

10 sai lầm phổ biến làm giảm hiệu suất ứng dung khi sử dụng Hibernate - Phần 1

Hello các bạn! Hôm nay có thể coi là hạn cuối viết report tháng của mình. Cả tháng rồi bận bịu chơi nên quên khuấy đi mất. Nhưng mình sẽ không vì thế mà viết ẩu đâu. Nội dung mình sắp chia sẻ ở dưới đây cho các bạn đề cập tới "10 sai lầm phổ biến làm giảm hiệu suất ứng dung khi sử dụng Hibernate". ...

Hello các bạn! Hôm nay có thể coi là hạn cuối viết report tháng của mình. Cả tháng rồi bận bịu chơi nên quên khuấy đi mất. Nhưng mình sẽ không vì thế mà viết ẩu đâu. Nội dung mình sắp chia sẻ ở dưới đây cho các bạn đề cập tới "10 sai lầm phổ biến làm giảm hiệu suất ứng dung khi sử dụng Hibernate". Bài viết được dịch và chỉnh sử từ 10 Common Hibernate Mistakes That Cripple Your Performance .Hi vọng sau bài viết này, các bạn có thể đúc rút ra 1 số kinh nghiệm cũng như lưu ý hơn khi sử dụng Hibernate - 1 ORM rất phổ biến trong lập trình các ứng dụng Java

Nếu như các bạn chưa đọc qua series bài viết Hibernate Caching toàn tập - Hướng dẫn có source code demo thì hãy ngó qua đôi chút nhé.

FetchingType định nghĩa khi nào Hibernate khởi tạo 1 liên kết (association). Bạn có thể chỉ ra điều đó với thuộc tính fetch của @OneToMany, @ManyToOne, @ManyToMany và @OneToOne annotation.

@Entity
public class Author{
 
    @ManyToMany(mappedBy="authors", fetch=FetchType.EAGER)
    private List<Book> books = new ArrayList<Book>();
     
    ...
     
}

Đúng như cái tên của nó. (Eager: háo hức). Với fetch = FetchType.EAGER, Hibernate sẽ load các liên kết khi nó load một thực thể. Ví dụ, khi Hibernate load một thực thể Author, nó cũng kéo về thông tin của các thực thể Book có liên kết tới Author đó. Thử nghĩ xem, nếu bạn cần thực hiện truy vấn đề lấy thông tin 1000 tác giả để phục vụ cho việc in danh thiếp cho họ, nhưng lệnh truy vấn đó của bạn ngoài việc lấy thông tin của các tác giả đó, lại đi lục lọi thông tin và hàng chục cuốn sách tương ứng của mỗi ông. Việc làm ấy chẳng phải rất vô nghĩa hay sao? Phuơng pháp này trong trường hợp vừa đề cập ở trên thực sự kém hiệu quả. Tốt hơn hết chúng ta nên thay thế bằng FetchType.LAZY. Nó sẽ trì hoãn (delay) việc khởi tạo quan hệ đó cho đến khi ta cần (q1). Điều đó tránh việc râts nhiều truy vấn không cần thiết, giúp hiệu năng ứng dụng của bạn được tăng lên.

FetchType mặc định JPA

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

Hibernate tôn trọng các giá trị mặc định đó nhưng khuyến nghị không sử dụng EARGE FETCHING Trong Hibernate document có viết

The Hibernate recommendation is to statically mark all associations lazy and to use dynamic fetching strategies for eagerness. This is unfortunately at odds with the JPA specification which defines that all one-to-one and many-to-one associations should be eagerly fetched by default. Hibernate, as a JPA provider, honors that default.

Vậy, câu hỏi đặt ra là, khi bạn sử dụng FetchType.LAZY, thì khi cần (mà mình đánh dấu q1 ở trên) ta phải làm thế nào? Thắc mắc đó mình sẽ giải thích cho các bạn ở 1 bài viết khác. Hoặc ngay bây giờ, bạn google là ra liền à             </div>
            
            <div class=

0