Tải chậm và tải háo hức trong C# là gì?

Trong hướng dẫn nhanh này, chúng tôi sẽ chỉ ra sự khác biệt và chỉ ra cách chúng tôi có thể sử dụng chúng trong Hibernate

2. Phụ thuộc Maven

Để sử dụng Hibernate, trước tiên hãy xác định phần phụ thuộc chính trong tệp pom của chúng tôi. xml


    org.hibernate
    hibernate-core   
    5.2.2.Final

Phiên bản mới nhất của Hibernate có thể được tìm thấy tại đây

3. Háo hức và lười tải

Điều đầu tiên mà chúng ta nên thảo luận ở đây là tải chậm và tải háo hức là gì

  • Eager Loading là một mẫu thiết kế trong đó việc khởi tạo dữ liệu xảy ra ngay tại chỗ
  • Lazy Loading là một mẫu thiết kế mà chúng tôi sử dụng để trì hoãn việc khởi tạo một đối tượng miễn là có thể

Hãy xem cách nó hoạt động

Đầu tiên, chúng ta sẽ xem lớp UserLazy

@Entity
@Table[name = "USER"]
public class UserLazy implements Serializable {

    @Id
    @GeneratedValue
    @Column[name = "USER_ID"]
    private Long userId;

    @OneToMany[fetch = FetchType.LAZY, mappedBy = "user"]
    private Set orderDetail = new HashSet[];

    // standard setters and getters
    // also override equals and hashcode

}

Tiếp theo, chúng ta sẽ thấy lớp OrderDetail

@Entity
@Table [name = "USER_ORDER"]
public class OrderDetail implements Serializable {
    
    @Id
    @GeneratedValue
    @Column[name="ORDER_ID"]
    private Long orderId;
    
    @ManyToOne[fetch = FetchType.LAZY]
    @JoinColumn[name="USER_ID"]
    private UserLazy user;

    // standard setters and getters
    // also override equals and hashcode

}

Một Người dùng có thể có nhiều Chi tiết Đơn hàng. Trong chiến lược tải háo hức, nếu chúng tôi tải dữ liệu Người dùng, nó cũng sẽ tải lên tất cả các đơn đặt hàng được liên kết với nó và sẽ lưu trữ nó trong bộ nhớ

Nhưng khi chúng tôi kích hoạt tải chậm, nếu chúng tôi kéo UserLazy lên, dữ liệu OrderDetail sẽ không được khởi tạo và tải vào bộ nhớ cho đến khi chúng tôi thực hiện lệnh gọi rõ ràng tới nó

Trong phần tiếp theo, chúng ta sẽ xem cách chúng ta triển khai ví dụ trong Hibernate

4. Đang tải cấu hình

Hãy xem cách định cấu hình các chiến lược tìm nạp trong Hibernate

Chúng tôi có thể bật Lazy Loading bằng cách sử dụng tham số chú thích này

fetch = FetchType.LAZY

Đối với Tìm nạp háo hức, chúng tôi sử dụng tham số này

fetch = FetchType.EAGER

Để thiết lập Eager Loading, chúng tôi đã sử dụng lớp song sinh của UserLazy có tên là UserEager

Trong phần tiếp theo, chúng ta sẽ xem xét sự khác biệt giữa hai loại tìm nạp

5. sự khác biệt

Như chúng tôi đã đề cập, sự khác biệt chính giữa hai loại tìm nạp là thời điểm dữ liệu được tải vào bộ nhớ

Chúng ta hãy có một cái nhìn

List users = sessionLazy.createQuery["From UserLazy"].list[];
UserLazy userLazyLoaded = users.get[3];
return [userLazyLoaded.getOrderDetail[]];

Với phương pháp khởi tạo lười biếng, orderDetailSet sẽ chỉ được khởi tạo khi chúng ta gọi nó một cách rõ ràng, sử dụng phương thức getter hoặc một số phương thức khác

UserLazy userLazyLoaded = users.get[3];

Nhưng với cách tiếp cận háo hức trong UserEager, nó sẽ được khởi tạo ngay ở dòng đầu tiên

List user = sessionEager.createQuery["From UserEager"].list[];

Để tải từng phần, chúng tôi sử dụng một đối tượng proxy và kích hoạt một truy vấn SQL riêng để tải orderDetailSet

Ý tưởng vô hiệu hóa proxy hoặc tải chậm được coi là một cách làm không tốt trong Hibernate. Nó có thể dẫn đến việc tìm nạp và lưu trữ rất nhiều dữ liệu, bất kể nhu cầu về nó

Chúng ta có thể sử dụng phương pháp sau để kiểm tra chức năng

________số 8

Bây giờ chúng ta hãy xem các truy vấn được tạo trong cả hai trường hợp

true

Cài đặt trên trong tìm nạp. hbm. xml hiển thị các truy vấn SQL được tạo. Nếu chúng ta nhìn vào đầu ra của bảng điều khiển, chúng ta có thể thấy các truy vấn được tạo

Đối với Lazy Loading, đây là truy vấn được tạo để tải dữ liệu Người dùng

@Entity
@Table[name = "USER"]
public class UserLazy implements Serializable {

    @Id
    @GeneratedValue
    @Column[name = "USER_ID"]
    private Long userId;

    @OneToMany[fetch = FetchType.LAZY, mappedBy = "user"]
    private Set orderDetail = new HashSet[];

    // standard setters and getters
    // also override equals and hashcode

}
0

Tuy nhiên, trong quá trình tải háo hức, chúng tôi đã thấy một liên kết được thực hiện với USER_ORDER

@Entity
@Table[name = "USER"]
public class UserLazy implements Serializable {

    @Id
    @GeneratedValue
    @Column[name = "USER_ID"]
    private Long userId;

    @OneToMany[fetch = FetchType.LAZY, mappedBy = "user"]
    private Set orderDetail = new HashSet[];

    // standard setters and getters
    // also override equals and hashcode

}
1

Truy vấn trên được tạo cho tất cả Người dùng, dẫn đến việc sử dụng bộ nhớ nhiều hơn so với cách tiếp cận khác

6. Ưu điểm và nhược điểm

6. 1. tải chậm

Thuận lợi

  • Thời gian tải ban đầu nhỏ hơn nhiều so với cách tiếp cận khác
  • Tiêu thụ bộ nhớ ít hơn so với cách tiếp cận khác

Nhược điểm

  • Khởi tạo bị trì hoãn có thể ảnh hưởng đến hiệu suất trong những thời điểm không mong muốn
  • Trong một số trường hợp, chúng ta cần đặc biệt cẩn thận khi xử lý các đối tượng được khởi tạo một cách lười biếng, nếu không chúng ta có thể gặp phải một ngoại lệ

6. 2. háo hức tải

Thuận lợi

  • Không có tác động hiệu suất liên quan đến khởi tạo bị trì hoãn

Nhược điểm

  • Thời gian tải ban đầu dài
  • Tải quá nhiều dữ liệu không cần thiết có thể ảnh hưởng đến hiệu suất

7. Lazy Loading trong Hibernate

Hibernate áp dụng phương pháp tải lười biếng trên các thực thể và liên kết bằng cách cung cấp triển khai proxy cho các lớp

Hibernate chặn các cuộc gọi đến một thực thể bằng cách thay thế nó bằng một proxy bắt nguồn từ lớp của một thực thể. Trong ví dụ của chúng tôi, thông tin được yêu cầu bị thiếu sẽ được tải từ cơ sở dữ liệu trước khi quyền kiểm soát được chuyển sang triển khai lớp Người dùng

Chúng ta cũng nên lưu ý rằng khi liên kết được biểu diễn dưới dạng một lớp tập hợp [trong các ví dụ trên, nó được biểu diễn dưới dạng Set orderDetailSet], một trình bao bọc được tạo và thay thế cho một tập hợp ban đầu

Mục đích của lazy loading là gì?

Tải chậm là chiến lược xác định tài nguyên là không bị chặn [không quan trọng] và chỉ tải những tài nguyên này khi cần . Đó là một cách để rút ngắn độ dài của đường dẫn hiển thị quan trọng, giúp giảm thời gian tải trang.

Sự khác biệt giữa tải lười biếng và háo hức trong chế độ ngủ đông là gì?

Eager Loading là một mẫu thiết kế trong đó quá trình khởi tạo dữ liệu diễn ra ngay tại chỗ. Lazy Loading là một mẫu thiết kế mà chúng tôi sử dụng để trì hoãn việc khởi tạo một đối tượng miễn là có thể .

Ưu điểm chính của tải chậm thay vì tải háo hức cho một người độc thân là gì?

Tải chậm cải thiện hiệu suất của ứng dụng nếu nó được sử dụng đúng cách . Chúng ta có thể sử dụng từ khóa Lazy để làm cho cá thể singleton tải chậm.

Sự khác biệt giữa kiểu tìm nạp háo hức và lười biếng là gì?

FetchType. LAZY = Điều này không tải các mối quan hệ trừ khi bạn gọi nó thông qua phương thức getter. FetchType. EAGER = Điều này tải tất cả các mối quan hệ .

Chủ Đề