Posted on 2006-01-13 22:24
JDeodar 閱讀(412)
評論(0) 編輯 收藏 所屬分類:
J2EE
Tansation Management -- 事務(wù)管理
應(yīng)用程序可以用于以下兩種手段來管理容器事務(wù),從而控制應(yīng)用服務(wù)器的事務(wù)管理服務(wù)
1、編程式事務(wù)管理:使用JTA UserTransaction對象,通過JNDI獲取
2、聲明式事務(wù)管理:通過使用組建模型(即EJB CMT),這是一種建立在JTA基礎(chǔ)設(shè)施之上的高層的服務(wù)
這兩種方法通常都被命名為“受控的事務(wù)”(EJB CMT)。
容器管理事務(wù)(Container-Managed Transaction)
優(yōu)點(diǎn):把事務(wù)管理從Java代碼中挪到了EJB部署描述符中。因此事務(wù)編程了一個(gè)無需硬編碼的橫切面。
缺點(diǎn):
1、只有EJB才能夠使用聲明式事務(wù)管理
2、聲明式事務(wù)實(shí)際上也符合80-20原則
3、EJB CMT必須使用全局事務(wù)管理,如果僅需要單事務(wù)的資源,大材小用。
Spring的聲明式事務(wù)管理建立在Spring的AOP框架之上,所以Spring的事務(wù)管理需要帶有AOP功能的Spring Bean工廠。
事物的傳播類型:(6種)
1、“required”運(yùn)行在當(dāng)前的事務(wù)范圍內(nèi),如果當(dāng)前沒有啟動事務(wù),那么創(chuàng)建一個(gè)新的事物
2、“supports”運(yùn)行在當(dāng)前的事務(wù)范圍內(nèi),如果當(dāng)前沒有啟動事務(wù),那么就不在事務(wù)范圍內(nèi)執(zhí)行
3、“mandatory”運(yùn)行在當(dāng)前的事務(wù)范圍內(nèi),如果當(dāng)前沒有啟動事務(wù),那么拋出異常
4、“requires new”創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前啟動了事務(wù),那么掛起當(dāng)前事務(wù)
5、“not supported”不在事務(wù)范圍內(nèi)執(zhí)行,如果當(dāng)前啟動了事務(wù),那么掛起當(dāng)前事務(wù)
6、“never”不在事務(wù)范圍內(nèi)執(zhí)行,如果當(dāng)前啟動了事物,那么拋出異常
默認(rèn)的事務(wù)類型是“required”,適用于絕大多數(shù)的情況。
編程式事務(wù)管理通常有以下兩種使用方式:一是通常的使用方式,在一個(gè)catch代碼塊中對任何異常進(jìn)行回滾處理;二是通過一個(gè)“控制反轉(zhuǎn)(IoC)”模版類和一個(gè)回調(diào)實(shí)現(xiàn)。
事物管理最適合使用AOP。
Spring的事務(wù)處理最重要的好處是,在不需要任何部署步驟和特定的需要的情況下,可以讓POJO具備事務(wù)處理能力。
YAGNI(You Arent Gonna Need It,不要為不必要的需求埋單)
Persistence -- 持久化
Patterns of Enterprise Application Architecture(2002 Martin Fowler),常簡稱POEAA -- 一定要讀
處理批量存取和批量更新時(shí),O/R映射會有問題,不知道什么時(shí)候才能解決優(yōu)化呢?
下面的征兆,可以考慮使用O/R映射:
1、針對領(lǐng)域?qū)ο蟮摹凹虞d/編輯/存儲”流程,例如先加載一條產(chǎn)品記錄,對其進(jìn)行修改,然后更新會數(shù)據(jù)庫。
2、對象以批量查詢的方式取出,但更新和刪除則是單獨(dú)進(jìn)行。
3、大量對象需要積極地緩存(通常出現(xiàn)在“讀操作遠(yuǎn)多于寫操作”的情況下,如web應(yīng)用。)
4、在領(lǐng)域?qū)ο笈c數(shù)據(jù)庫表/字段之間有一個(gè)相當(dāng)自然的對應(yīng)關(guān)系。
5、不需要對SQL進(jìn)行特別的優(yōu)化。
細(xì)粒度的領(lǐng)域模型不應(yīng)該用重量級的EJB組件來建模,而應(yīng)該用簡單的Java對象——POJO(Plain Old Java Object)——來建模。
所有的持久化技術(shù)必然會涉及對資源的管理:
1、連接工廠
2、連接
DAO模式的用途是將“與持久化相關(guān)的代碼”從業(yè)務(wù)邏輯中分離出來,換句話說,把業(yè)務(wù)流程和規(guī)則放在一邊,與持久化相關(guān)的問題放在另一邊。DAO模式需要一個(gè)DAO接口,以便將特定的數(shù)據(jù)訪問實(shí)現(xiàn)細(xì)節(jié)隱藏起來。
使用Spring框架進(jìn)行數(shù)據(jù)訪問
1、Spring的bean工廠和應(yīng)用上下文容器使得應(yīng)用程序中的各種對象能夠輕松地裝配起來。
2、Spring有一個(gè)清晰的事務(wù)模型
3、Spring提供了一個(gè)通用的數(shù)據(jù)庫訪問異常體系。
4、對于各種持久化方式,Spring用形式統(tǒng)一的模版機(jī)制解決了關(guān)閉連接、處理異常等問題。
JdbcTemplate實(shí)例(以及別的Spring模版)都是線程安全的,允許多線程復(fù)用。因此只需要在DAO初始化將一個(gè)JdbcTemplate實(shí)例提供給它,所有的DAO方法都可以使用這同一個(gè)模版實(shí)例,不必?fù)?dān)心任何同步問題。
Spring框架提供了另一個(gè)層次較高的JDBC抽象:可詢操作、更新操作或是存儲過程。