簡體   English   中英

在Java-EE中透明地管理每個請求的事務

[英]Transparently managing per-request transactions in Java-EE

我正在開發一個JEE應用程序,其中對“ facade” bean所做的每個請求都應運行一個事務。

基本上,在每種方法中,我都可以這樣做:

@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兼容

感謝您的建議。

Java事務API(JTA)滿足了您的需求。 從JEE6教程(第八部分-第42章)中:

Java事務API(JTA)允許應用程序以獨立於特定實現的方式訪問事務。 JTA指定了事務管理器與分布式事務處理系統中涉及的各方之間的標准Java接口:事務處理應用程序,Java EE服務器以及它們對控制受事務影響的共享資源的訪問的管理器。

您要使用容器管理的事務。 在這種策略中,您只需要使用適當的事務屬性來裝飾Bean /方法,即:

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

服務層的設計必須仔細解決事務生命周期,以防您擁有服務服務(嵌套服務調用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM