[英]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可能不會被銷毀。
兩個小限制:
感謝您的建議。
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.