2014-01-27 36 views
0

我正在開發一個JEE應用程序,其中對「facade」bean執行的每個請求都應運行單個事務。透明地管理Java-EE中的每個請求事務

基本上,在每一個方法,我能做到這一點是這樣的:

@Override 
public void updateSalaries(float factor) 
{ 
    initializeTransaction(); 
    // Actual business code... 
    commitTransaction(); 
} 

凡ùpdateSalaries()is a method invoked by the client, and where initializeTransaction()and commitTransaction()`分別照顧越來越/開始/提交/回滾(如有必要)交易。

不幸的是,事務管理應該更透明:開發人員在編寫業務方法時不應該關心的東西。

因此,「裝飾」這些業務方法的一些方法會很好,但我想不出一種可能的方式來做到這一點。

另一種可能的解決方案我想到的是處理它在中央DataAccessBean類,在那裏我會在@PostConstruct啓動事務並提交它@PreDestroy

@Stateless 
public class DataAccessBean implements IDataAccessBean 
{ 
    @PostConstruct 
    public void initializeTransaction() { /* ... */ } 

    @PreDestroy 
    public void endTransaction() { /* ... */ } 

    @Override 
    public <T implements Serializable> T getObjectById(
     Class<T> objectType, Object key) { /* ... */ } 

    @Override 
    public void saveObject(Serializable object) { /* ... */ } 
} 

我不知道不過,如果我可以依靠這個機制。一個重要的問題是,我需要什麼類型的bean:我懷疑一個有狀態bean是否合適,因爲事務是按請求而不是按會話。也許無狀態bean將是一個不錯的選擇,但是AFAIK無狀態bean在請求完成時可能不會被銷燬(如果它駐留在無狀態bean池中)。

兩個小的約束:

  • 溶液不應該依賴於特定的非標準框架或JEE-服務器
  • 溶液應與JEE 6和JEE 7

兼容感謝您的建議。

回答

1

您需要的是Java Transaction API(JTA)解決的問題。從JEE6教程(第八部分 - 第42章):

Java事務API(JTA)允許應用程序在訪問amanner交易是 獨立speciic實現。 JTA規定了事務管理者與分佈式事務處理系統中涉及的各方之間的標準Java接口:事務處理應用程序,Java EE服務器和管理對事務處理的共享資源的訪問的管理器。

您想要使用容器管理的事務。在這種策略中,你只需要裝飾豆/用適當的交易方式的屬性,即:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void myMethod() { 
... 
} 

你的服務層必須認真解決的事務生命週期的情況下的設計您有服務的服務(嵌套的服務調用) 。