2009-09-23 8 views
5

Có một tuyên bố trong ejb-3_0-fr-spec-persistence.pdf mà đọcJPA: Làm cách nào để đồng bộ hóa ngữ cảnh liên tục với kết quả cập nhật hàng loạt hoặc xóa?

Bối cảnh kiên trì không được đồng bộ hóa với các kết quả của sự cập nhật hàng loạt hoặc xóa

Vì vậy, nếu tôi thực hiện query.executeUpdate để xóa các hàng khỏi bảng. Những hàng tương tự vẫn tồn tại trong một thực thể khác một đến nhiều bộ sưu tập. Khi tôi khởi động lại ứng dụng, tôi thấy các thực thể ảo hiện đã bị xóa khỏi bộ sưu tập.

Vậy có cách nào để đồng bộ hóa bộ nhớ cache của JPA với kết quả cập nhật hàng loạt \ xóa không?

BTW. Im sử dụng EclipseLink, phiên bản: Dịch vụ kiên trì Eclipse - 1.1.0.r3634.

Xin cảm ơn,

Phil.

+1

Tôi tin rằng có [http://stackoverflow.com/questions/5832415/entitymanager-refresh][1]. Nó làm việc cho tôi thực sự. [1]: http://stackoverflow.com/questions/5832415/entitymanager-refresh –

Trả lời

5

Bạn phải cẩn thận về cách bạn sử dụng từ "bộ nhớ cache" ở đây vì nó có thể có nghĩa là những thứ khác nhau.

Cuộc hội thoại cụm từ được đánh dấu về bối cảnh kiên trì, có thể được coi là "bộ nhớ cache cấp 1". Để cập nhật nó với những thay đổi mới nhất từ ​​cơ sở dữ liệu bạn có thể:

  1. Gọi EntityManager.refresh() để làm mới tình trạng của một đơn thực thể .
  2. HOẶC loại bỏ hoàn toàn trình quản lý đối tượng (sau khi xóa/xóa thay đổi khi thích hợp) và lấy một thay đổi mới từ nhà máy quản lý tổ chức. Bất kỳ thực thể nào bạn tải từ bên trong cá thể mới này sẽ được tải từ cơ sở dữ liệu và do đó chứa các thay đổi mới nhất.

Sau đó, cũng có thể có "bộ nhớ cache cấp 2" không bị ràng buộc với người quản lý thực thể cụ thể. Bạn có thể làm mới nó (hoặc, thay vào đó, rõ ràng và để cho nó repopulate chính nó) bằng cách sử dụng API riêng của mình (khác nhau giữa các nhà cung cấp bộ nhớ cache).

1

Ngữ cảnh kiên trì không được cập nhật để phản ánh kết quả của hoạt động cập nhật và xóa. Nếu bạn sử dụng một bối cảnh persistence giao dịch phạm vi, bạn nên thực hiện các hoạt động số lượng lớn trong một giao dịch tất cả bởi chính nó, hoặc là hoạt động đầu tiên trong giao dịch (xem Giới thiệu về các giao dịch EclipseLink). Đó là bởi vì bất kỳ thực thể nào được chủ động quản lý bởi ngữ cảnh kiên trì sẽ vẫn không biết về những thay đổi thực sự xảy ra ở cấp cơ sở dữ liệu.

Fell thoải mái để làm tôi gục ở đây tại http://puspendu.wordpress.com/2010/12/22/sync-jpa-database-multiple-application/

4

Đây là cách bạn xóa dữ liệu lưu trữ.

entityManager.getEntityManagerFactory().getCache().evictAll(); 
+0

Còn hiệu suất khi tiếp tục như thế thì sao? –

1

Bộ nhớ cache cấp 1 (EntityManager/giao dịch) cần phải được làm mới hoặc xóa theo cách thủ công. Bạn có thể làm mới các đối tượng, gọi clear() hoặc nhận một EntityManager mới.

Bộ nhớ cache cấp 2 (bộ nhớ cache dùng chung) sẽ tự động bị vô hiệu khi bạn thực hiện giao dịch. Nếu nó không phải vì một lý do nào đó, thì bạn có thể sử dụng JPA Cache API, hoặc EclipseLink JpaCache API để gỡ bỏ hoặc vô hiệu hóa các đối tượng, hoặc bạn có thể làm mới chúng.