Đơn vị độ bền là RESOURCE_LOCAL hay JTA?


87

Tôi có các câu hỏi như sau:

  1. Sự khác biệt của hai cái này là gì?
  2. Cả hai điều này có được hỗ trợ bởi tất cả các cơ sở dữ liệu không?
  3. JPA TransactionManager và JTA TransactionManager có khác nhau không?

Câu trả lời:


101

Việc triển khai JPA có lựa chọn tự quản lý các giao dịch ( RESOURCE_LOCAL) hoặc để chúng được quản lý bởi triển khai JTA của máy chủ ứng dụng.

Trong hầu hết các trường hợp, RESOURCE_LOCAL là tốt. Điều này sẽ sử dụng các giao dịch cấp JDBC cơ bản. Nhược điểm là giao dịch là cục bộ đối với đơn vị lâu dài JPA, vì vậy nếu bạn muốn một giao dịch kéo dài nhiều đơn vị lâu dài (hoặc cơ sở dữ liệu khác), thì RESOURCE_LOCAL có thể không đủ tốt.

JTA cũng được sử dụng để quản lý các giao dịch trên các hệ thống như JMS và JCA, nhưng đó là cách sử dụng khá kỳ lạ đối với hầu hết chúng ta.

Để sử dụng JTA, bạn cần hỗ trợ cho nó trong máy chủ ứng dụng của mình và cả hỗ trợ từ trình điều khiển JDBC.


3
Có vẻ như glassfih không cho phép tôi sử dụng resource_local - làm thế nào tôi có thể làm điều đó?
Pete_ch

3
Một lưu ý nhỏ: người ta vẫn có thể có được chức năng JTA, ngay cả khi không có máy chủ ứng dụng Java EE đầy đủ bằng cách sử dụng các giải pháp của bên thứ ba, như Atomikos chẳng hạn . Vì vậy, bạn có thể có một vùng chứa web nhẹ như Tomcat mà vẫn nhận được sự hỗ trợ của JTA.
Informatik01

84

Như một phần bổ sung cho các câu trả lời khác

Đây là một đoạn trích từ bài viết cực kỳ hữu ích (được đăng trên trang web Apache TomEE ), cũng có thể giúp trả lời câu hỏi đầu tiên của OP (liên kết đến bài viết ở bên dưới).


So sánh ngữ cảnh liên tục RESOURCE_LOCAL và JTA


Với <Persistence-unit transaction-type = "RESOURCE_LOCAL"> BẠN chịu trách nhiệm cho EntityManager (PersistenceContext / Cache) tạo và theo dõi ...

  • Bạn phải sử dụng EntityManagerFactory để có được EntityManager
  • Cá thể EntityManager kết quả một PersistenceContext / Cache
  • Một EntityManagerFactory chỉ có thể được đưa vào thông qua chú thích @PersistenceUnit (không phải @PersistenceContext)
  • Bạn không được phép sử dụng @PersistenceContext để chỉ đơn vị thuộc loại RESOURCE_LOCAL
  • Bạn phải sử dụng API EntityTransaction để bắt đầu / cam kết mọi lệnh gọi tới EntityManger của bạn
  • Việc gọi entityManagerFactory.createEntityManager () hai lần dẫn đến hai trường hợp EntityManager riêng biệt và cho hai PersistenceContexts / Caches riêng biệt.
  • Đó là hầu như không bao giờ là một ý tưởng tốt để có nhiều hơn một ví dụ của một EntityManager sử dụng (không tạo ra một thứ hai, trừ khi bạn đã phá hủy đầu tiên)


Với <kiên trì đơn vị giao dịch type = "JTA"> các CONTAINER sẽ làm EntityManager (PersistenceContext / Cache) tạo và theo dõi ...

  • Bạn không thể sử dụng EntityManagerFactory để nhận EntityManager
  • Bạn chỉ có thể nhận được EntityManager do vùng chứa cung cấp
  • Một EntityManager chỉ có thể được đưa vào thông qua chú thích @PersistenceContext (không phải @PersistenceUnit)
  • Bạn không được phép sử dụng @PersistenceUnit để chỉ một đơn vị thuộc loại JTA
  • Các EntityManager đưa ra bởi các container là một tài liệu tham khảo cho PersistenceContext / Cache liên kết với một giao dịch JTA.
  • Nếu không có giao dịch JTA nào đang diễn ra, EntityManager không thể được sử dụng vì không có PersistenceContext / Cache.
  • Mọi người có tham chiếu EntityManager đến cùng một đơn vị trong cùng một giao dịch sẽ tự động có tham chiếu đến cùng một PersistenceContext / Cache
  • Các PersistenceContext / Cache là đỏ mặt và được thông quan tại JTA cam kết thời gian

Bất kỳ ai quan tâm đến việc tìm hiểu Java Persistence API - hãy tự giúp mình và đọc toàn bộ bài viết tại đây: Các khái niệm JPA: JPA 101 .


8
Chỉ muốn thêm một điểm: Nếu bạn đang sử dụng Spring, bạn có thể sử dụng @ PersistenceContext và EntityManager với Resource_Local. Trong trường hợp này, vùng chứa Spring có thể quản lý giao dịch bằng cách sử dụng chú thích @ Transactional.
Sam

Trong dự án của tôi transaction-type=RESOURCE_LOCAL@PersistenceContext@Transactionalbởi Spring quản lý
Ravi Parekh

Tôi đang đánh vào hình tam giác hướng lên vì liên kết bạn cung cấp.
Koray Tugay

@KorayTugay Tôi xin lỗi, không hiểu bạn nói gì, hình tam giác gì?
Informatik01

1
@LinuRadu Câu trả lời này có thể hữu ích cho bạn: Việc sử dụng session.flush () trong Hibernate là gì
Informatik01

18

Resource_Local và JTA là các trình quản lý giao dịch (các phương thức thực hiện giao dịch). Đây không phải là thuộc tính của cơ sở dữ liệu mà là thành phần chịu trách nhiệm điều phối các giao dịch. Người quản lý giao dịch JPA và JTA khác nhau. Người quản lý giao dịch JPA chịu trách nhiệm về các giao dịch JPA và bạn muốn sử dụng một người quản lý nếu bạn chỉ thực hiện giao dịch JPA. Người quản lý giao dịch JTA là người quản lý giao dịch mục đích chung và có thể tranh thủ các tài nguyên khác như hàng đợi JMS trong giao dịch. Thông thường, các vùng chứa Java EE sử dụng trình quản lý giao dịch JTA cho các EJB, các thực thể JPA, v.v.


1

resource_local so với JTA về giao dịch địa phương so với giao dịch toàn cầu. Đó là về việc chúng ta có thể quản lý nhiều tài nguyên trong một giao dịch duy nhất.

CMT so với BMT nói về ai đang mở và đóng giao dịch - nhà phát triển ứng dụng hoặc máy chủ ứng dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.