2010-07-10 10 views
49

Thuật ngữ "jta-datasource" và "nguồn dữ liệu địa phương" có chút mơ hồ đối với tôi. Tôi đang đặt ra những gì tôi hiểu (hoặc giả định) và tôi muốn bạn nói rằng tôi đúng/sai.Sự khác biệt giữa nguồn dữ liệu "jta-datasource" và nguồn dữ liệu "tài nguyên cục bộ"?

  • Cùng cơ sở dữ liệu có thể được gọi là một JTA-nguồn dữ liệu hoặc như một nguồn lực nguồn dữ liệu địa phương
  • Nếu đề cập như JTA-nguồn dữ liệu, sau đó đậu/classes khác có thể sử dụng JTA. Do đó, giao diện UserTransaction
  • Không thể sử dụng CMT/BMT nếu nguồn dữ liệu là tài nguyên cục bộ
  • Nếu được đề cập dưới dạng nguồn dữ liệu cục bộ, giao dịch không được JTA biết. Mã có thể sử dụng giao diện EntityTransaction nhưng không sử dụng giao diện UserTransaction

Cảm ơn!

Trả lời

62

Thuật ngữ "jta-datasource" và "nguồn dữ liệu địa phương resouce" hơi mơ hồ đối với tôi.

Tôi đoán bạn thực sự tham chiếu đến các yếu tố jta-datasourcenon-jta-datasource. Nói tóm lại:

  • nếu loại giao dịch của đơn vị kiên trì là JTA, yếu tố jta-datasource được sử dụng để khai báo tên JNDI của nguồn dữ liệu JTA sẽ được sử dụng để có được kết nối. Đây là trường hợp phổ biến.
  • nếu loại giao dịch của đơn vị lưu giữ là tài nguyên cục bộ, nên sử dụng non-jta-data-source để khai báo tên JNDI của nguồn dữ liệu không phải JTA.
  • Cùng cơ sở dữ liệu có thể được gọi là một JTA-nguồn dữ liệu hoặc như một nguồn lực nguồn dữ liệu địa phương

này là đúng. Và tôi không đề cập đến điều đó ngay cả ở trên nhưng một số nhà cung cấp thậm chí còn cho phép khai báo cả hai số jta-datasource a non-jta-datasource và sử dụng sau này để đọc tối ưu qua kết nối không phải JTA (tức là sẽ không được liên kết với giao dịch JTA đang diễn ra) .

  • Nếu được đề cập là jta-datasource, thì hạt/lớp khác có thể sử dụng JTA. Do đó, giao diện UserTransaction.

Phần đầu tiên là chính xác, phần cuối cùng không hoàn toàn. Từ spec EJB 3.0, phần 13.3.4 Đậu Enterprise Sử dụng container-Managed Phân định giao dịch:

phương pháp kinh doanh bean doanh nghiệp của [...] phải không cố gắng để có được hoặc sử dụng giao diện javax.transaction.UserTransaction.

Và phần 16,12 UserTransaction Interface:

Bình chứa không phải làm cho giao diện UserTransaction sẵn cho enterprise bean mà không được phép sử dụng giao diện này.

Nói cách khác, giao diện UserTransaction không khả dụng cho hạt doanh nghiệp CMT.

  • Không thể sử dụng CMT/BMT nếu nguồn dữ liệu là tài nguyên địa phương

Các từ ngữ được một chút bối rối ở đây nhưng tôi muốn nói rằng đây không phải đúng chính xác. Từ 1.0 đặc điểm kỹ thuật JPA, phần § 5,5 Kiểm soát giao dịch:

Một người quản lý thực thể ứng dụng quản lý có thể là một người quản lý thực thể JTA hoặc người quản lý thực thể tài nguyên địa phương.

...

Cả JTA nhà quản lý tổ chức và cán bộ quản lý thực thể tài nguyên địa phương được yêu cầu để được hỗ trợ trong vùng chứa web Java EE và EJB container. Trong môi trường EJB, người quản lý thực thể JTA thường được sử dụng.

phần 6.2.1.2 giao dịch kiểu

Thuộc tính transaction-type được sử dụng để xác định xem các nhà quản lý thực thể được cung cấp bởi nhà máy quản lý tổ chức cho các đơn vị bền vững phải được nhà quản lý thực thể JTA hoặc tài nguyên quản lý thực thể trung tâm. Giá trị của phần tử này là JTA hoặc RESOURCE_LOCAL. Một loại giao dịch của JTA giả định rằng một nguồn dữ liệu JTA sẽ được cung cấp - hoặc theo quy định của yếu tố jta-data-source hoặc được cung cấp bởi vùng chứa. Nói chung, trong môi trường Java EE, transaction-type của RESOURCE_LOCAL giả định rằng nguồn dữ liệu không phải JTA sẽ được cung cấp. Trong môi trường Java EE, nếu phần tử này không được chỉ định, mặc định là JTA.

để bạn có thể sử dụng một ứng dụng quản lý tổ chức quản lý mà có thể là một người quản lý thực thể tài nguyên địa phương (bạn phải tiêm một EntityManagerFactory để có được sản phẩm EM từ nó trong trường hợp đó) và nó sẽ không được một phần của giao dịch JTA. Xem this (very interesting) discussion.

  • Nếu được đề cập dưới dạng nguồn dữ liệu cục bộ, giao dịch không được JTA nhận thức. Mã có thể sử dụng giao diện EntityTransaction nhưng không phải giao diện UserTransaction

Một lần nữa, các từ ngữ là một chút bối rối nhưng tôi muốn nói rằng điều này là đúng.

+0

Xin chào, Cảm ơn bạn đã dành thời gian và giải thích rõ ràng! Bây giờ tôi thấy rằng chúng tôi sử dụng thuật ngữ "tài nguyên địa phương EntityManager" và không phải "nguồn dữ liệu địa phương tài nguyên". Có, tôi có nghĩa là không phải jta-datasource khi tôi nói "nguồn dữ liệu địa phương nguồn". Đây là cách tôi hiểu bây giờ: JTA/RESOURCE_LOCAL -> Loại giao dịch của EntityManager. Xác định ai kiểm soát giao dịch cơ bản. liệu JTA/EntityTransaction API JTA EntityManger: Vùng chứa quản lý EntityManager này. Liên quan đến giao dịch JTA. Giao dịch JTA có thể là CMT hoặc BMT. Có thể được sử dụng trong các lớp được quản lý. – stratwine

+0

Resource-Local EntityManager: EnityManager không được vùng chứa quản lý. Tham gia vào các giao dịch không phải của JTA. API EntityTransaction được sử dụng. có thể sử dụng trong các POJO Đối với BMT, UserTransaction luôn luôn sử dụng một JTA-nguồn dữ liệu và không thể sử dụng một tổ chức phi JTA-nguồn dữ liệu Tương tự như vậy đối với CMT quá, container chỉ có thể sử dụng một JTA-nguồn dữ liệu – stratwine

+1

@stratwine: Bạn đang chào đón , vui vì bạn thấy nó hữu ích (và sự hiểu biết của bạn có vẻ chính xác). Về từ ngữ, tôi không có ý cầu kỳ nhưng vì spec xác định một thuật ngữ rất chính xác (và tinh tế), sử dụng nó làm cho giao tiếp dễ dàng hơn, đó là lý do tại sao tôi khăng khăng một chút về điều đó (và tôi khuyên bạn nên đọc các phần tôi đã trích dẫn một phần). –