zoukankan      html  css  js  c++  java
  • 学习编译更好的 DAO 的技巧

    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.

  • 相关阅读:
    腾讯之困,QQ与微信各有各的烦恼
    Attribute(一)——提前定义特性
    假设有来生
    codeforces248(div1) B Nanami's Digital Board
    驳斥苹果“诊断后门论”,声援扎德尔斯基
    python批量下载色影无忌和蜂鸟的图片 爬虫小应用
    建筑建模学习笔记2——3DMax房屋框架建模
    【大话QT之十六】使用ctkPluginFramework插件系统构建项目实战
    javaObject类
    java基本类型和String之间的转换
  • 原文地址:https://www.cnblogs.com/oisiv/p/667034.html
Copyright © 2011-2022 走看看