一个人-我的学习随笔

有时候对待技术就好像对待女人,我们通常在已经了解或者相信她有着诱人的身体的时候,才会乐于或者有耐心对待脱衣的前戏。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

http://www.openitpower.com/wenzhang/103/13829_1.html
這篇來自ibm網站的文章非常清楚的說明了DAO模式的一些被忽略的設計準則,涉及到事務界定、異常處理和日誌記錄.特別是事務界定,在設計中,DAO的設計必須與實際環境中事務的需求聯繫起來,才能選定最佳的方式.

1.DAO中如果有可能被其他DAO調用,那最好在DAO中不包含事務的處理,除非該DAO確定是應該在獨立的事務當中,即嵌套事務.一般將事務放在比DAO更高一層的服務里控制.

2.在一個執行線程中,如果涉及到多個DAO,或是多個數據庫的操作,那因該採用JTA數據源,以及採用JTA的事務處理方式.
(上面的多個數據庫,是否可以指來自同一個數據庫的多個連接,或是來自多個數據庫的連接,這兩種情況應該都算JTA的範圍呢?因為在連接池的環境中,如果每個DAO是單獨取得連接的)

3.在SPRING中,如果將事務交有SPRING來管理,那DAO中就不需要事務處理的代碼.一個服務調用一個或多個DAO,這些DAO都在一個事務當中.不管這個DAO是採用HibernateDAOSupport或是JdbcDAOSupport,還是直接採用jdbc,都是在同一個連接,同一個事務當中.這是因為調用一個服務方法時,會開始一個新的事務,然後會將該事務對應的連接綁定到當前線程,所以多個DAO都會使用這個連接的這個事務.要注意的是DAO在直接使用JDBC的時候,必須用DataSourceUtils.getConnection(getDataSource(curDB))得到連接,因為這個方法會先檢查當前線程是否有綁定連結.如果有就取得當前連接,沒有則返回一個新事務並綁定連結.(當服務被指定擁有事務時,數據庫連接才會被綁定,如果服務沒有指定擁有事務,如聲明為PROPAGATION_SUPPORTS,那麼會返回一個無效的連接,這個有點奇怪,怎麼不拋出錯誤,或是返回null???)

4,SPRING也可以支持嵌套事務,通過對某個服務方法設置事務傳播選項,如PROPAGATION_NESTED就可以實現.當其他服務調用這個服務方法的時候,這個服務將在自己獨立的環境中完成,不受外部事務的回滾的影響.

5.另外,有關java調用存儲過程中的事務處理,存儲過程內部不包含事務,事務統一由程序自己控制;當某個存儲過程中包含對表即使是臨時表的事務操作性的動作如insert,update,delete,那麼在程序中就應該賦予事務(事務不能為只讀readonly),當然如果存儲過程沒涉及到事務操作性的動作,那可以設置為readonly.

posted on 2007-03-07 17:07  oisiv  阅读(402)  评论(1编辑  收藏  举报