JDBC分層事務管理機制
雖然ORM框架在J2EE應用中大行其道,但是使用JDBC直接訪問數據庫方式因其簡單和強大而在許多時候對開發者極具誘惑力。尤其在複雜的多 表關聯集合操作的時候,ORM框架大多顯得笨拙並且力不從心,而一條使用統計函數的sql語句卻可以直接搞定。因此通常在我設計J2EE應用程序架構的時 候會在持久層框架中保留兩種訪問數據庫的方式――Hibernate和JDBC。
基於J2EE分層架構設 計思想,數據訪問層應該專門處理數據訪問,而業務邏輯則在業務邏輯層中處理。爲了提高複用,數據訪問層對象(DAO)的粒度通常都非常小,一個更新操作被 封裝在一個方法中,這樣當有多個更新操作需要被捆綁爲一個事務的時候,事務的處理只能在業務邏輯層中實現。
在不分層的情況下,一個典型的JDBC事務處理代碼片斷如下。
try {
conn =DriverManager.getConnection
("jdbc:oracle:thin:@host:1521:SID","username","userpwd";
conn.setAutoCommit(false);//禁止自動提交,設置回滾點
stmt = conn.createStatement();
stmt.executeUpdate(“alter table …”); //數據庫更新操作1
stmt.executeUpdate(“insert into table …”); //數據庫更新操作2
conn.commit(); //事務提交
}catch(Exception ex) {
ex.printStackTrace();
try {
conn.rollback(); //操作不成功則回滾
}catch(Exception e) {
e.printStackTrace();
}
}
分 層的JDBC事務機制通過TransactionController和TransactionControllerFactory兩個類來進行事務管 理。數據訪問層的更新操作都添加到TransanctionController中,在業務邏輯層中將事務commit。業務邏輯層和數據訪問層通過 TransactionControllerFactory來獲得同一個事務控制器TransactionController。
事務控制器TransactionController接口代碼
public interface TransactionController {
public void add(DataAccessor da){} //將數據庫操作的具體實現DataAccessor添加到事務控制器
public int execute() throws SQLException{} //commit事務,如果異常,rollback。
}
事務控制器工廠TransactionControllerFactory實現類代碼
public class TransactionControllerFactory{
public static final ThreadLocal session = new ThreadLocal();
/**
* 啓動TransactionController
*/
public static TransactionController currentController() {
TransactionController ts = (TransactionController) session.get();
if (ts == null) {
ts = new TransactionController ();
session.set(ts);
}
return ts;
}
/**
* 結束TransactionController
*/
public static void closeController() {
session.remove();
}
}
業務邏輯層代碼舉例
{
Test1Dao test1Dao = new DaoFacotory.getTest1Dao();
Test2Dao test1Dao = new DaoFacotory.getTest2Dao();
TransactionController tc = TransactionControllerFactory.currentController();
test1Dao.insertStaff (staff);
test2Dao.updateGroup(group)
tc.execute();
}
數據訪問層代碼舉例
Public class Test1Dao{
Public void insertStaff(Staff staff){
TransactionController tc = TransactionControllerFactory.currentController();
DataAccessor da = DataAccessorFactory.getDataAccessor(…);//獲取數據庫操作實例DataAccessor
da.setParameter(….);//設置DataAccessor參數
tc.add(da);//將數據庫操作實例添加到事務控制器
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.