2010-04-21 20 views
6

Tôi đang sử dụng 2 PU trong EJB stateless và mỗi người trong số họ được gọi vào một phương pháp:Làm cách nào để ngăn chặn "Giao dịch địa phương đã có 1 ngoại lệ" không phải XA?

@PersistenceContext(unitName="PU") 
private EntityManager em; 
@PersistenceContext(unitName="PU2") 
private EntityManager em2; 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void getCandidates(final Integer eventId) throws ControllerException { 
    ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId); 
    ... 
    Person person = getPerson(candidate.getLogin()); 
    ... 
} 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
private Person getPerson(String login) throws ControllerException { 
    Person person = em2.find(Person.class, login); 
    return person; 
} 

Những phương pháp được chú thích với REQUIRES_NEW transcaction để tránh ngoại lệ này. Khi tôi gọi phương thức này từ applet javaFX, tất cả đều hoạt động như mong đợi. Bây giờ tôi đang cố gắng gọi chúng từ JAX-RS webservice (tôi không thấy bất kỳ sự khác biệt hợp lý nào như trong cả hai trường hợp ejb được tra cứu trong ngữ cảnh ban đầu) và tôi tiếp tục nhận được ngoại lệ này. Khi tôi thiết lập XADatasource trong các pool kết nối glassfish 2.1, tôi có ngoại lệ nullpointer trên em2.

Bất kỳ ý tưởng nào cần thử tiếp theo?

Trân

+0

Xem thêm http://stackoverflow.com/questions/2413911/if-i-access-usertransaction-does-this-mean-that-i-use-2-phase-commit-or-xa/2425585#2425585 – ewernli

Trả lời

5

Ok,

hiện đã được giải quyết. Tôi sẽ chia sẻ chỉ trong trường hợp ai đó đã giải quyết bằng điều tương tự. Toàn bộ vấn đề là với việc triển khai netbeans. Họ ghi đè lên các thiết lập trong hồ bơi kết nối glassfish và khi bạn thiết lập chúng thích hợp trong thời gian chạy, bạn có npe hoặc thiếu mật khẩu công cụ ngớ ngẩn. Nơi chỉnh sửa này là sun-resources.xml. Phần tử XML có thuộc tính datasource-classname và rs-type. Cần phải làm gì trong trường hợp cơ sở dữ liệu Derby là:

<jdbc-connection-pool ... 
     datasource-classname="org.apache.derby.jdbc.ClientXADataSource" 
     res-type="javax.sql.XADataSource"> 
    ... 
</jdbc-connection-pool> 

Hiện hoạt động như một sự quyến rũ ngay bây giờ.

2

Tôi đang sử dụng 2 PU trong EJB stateless và mỗi người trong số họ được gọi vào một phương pháp

Thật vậy. Nhưng bạn gọi phương thức thứ hai từ phương thức đầu tiên để bạn thực hiện giao dịch phân tán và bạn cần sử dụng XA cho điều này (ít nhất là đối với một trong các tài nguyên vì GlassFish hỗ trợ last agent optimization cho phép liên quan đến một tài nguyên không phải XA) . Nói cách khác, đặt một trong các nguồn dữ liệu của bạn là XADataSource là cách để đi.

Nếu bạn gặp lỗi khi thực hiện việc này, vui lòng thêm chi tiết về những gì bạn đã làm chính xác và ngăn xếp chồng.

+0

Cảm ơn bạn, tôi sẽ đăng nó càng sớm càng tốt nhưng trong meaninme, có cách nào để xác định XADataSource trong persistence.xml không? Tôi couln't tìm thấy nó bất cứ nơi nào và mỗi khi tôi triển khai thông qua netbeans các thiết lập glassfish trong hồ bơi kết nối được hoàn nguyên để DataSource đồng bằng. – zeratul021

1

Khi gọi phương thức thứ hai từ phương thức đầu tiên, đó không phải là cuộc gọi phương thức EJB. Nó xử lý nó như chỉ là một cuộc gọi phương thức thông thường và không nhìn vào @TransactionAttribute. Nếu bạn muốn có một cuộc gọi đến cùng một EJB, bạn có thể tiêm SessionContext và gọi getBusinessObject. Sau đó gọi phương thức trên EJB được trả về.

Các vấn đề liên quan