使用持久層框架
當然,iBATIS不能實現高層開發和維護SQL語句,而且缺乏可移植性。為了避免這類問題,你需要用到持久層框架。持久層框架可以將對象域映射到數據庫中。它提供了創建,查找,刪除對象的API函數。當程序要控制對象時它可以自動的加載相應的對象,還可以在事務處理結束時自動更新數據庫。持久層框架通過對象/關系映射機制可以自動的生成SQL語句,對象/關系映射機制用XML文檔定義了怎樣將類映射為表,怎樣將數據映射為列(column)和關系是怎樣被映射為外鍵與連接表的。
在持久層構架上EJB也有它的短處:實體bean.EJB2的實體bean有很多的不足,而且開發和測試它會變得非常的枯燥。最后,很少用EJB2的實體bean了。在EJB3中會說明那些問題。
兩種最有流行的輕量級持久層構架是JDO和Hibernate,前者是Sun的標準框架,后者是開源工程。兩種框架都可以為POJO類提供持久層事務處理。你可以用POJO類來開發和測試你的業務邏輯,而不用擔心持久層的問題,這個時候它會將類映射到數據庫中的schema.另外,他們兩個都可以在服務器程序外部或者內部,這樣可以進一步降低開發難度。用Hibernate和JDO來進行開發比用老的EJB2的實體bean要舒服的多。
除了要決定怎樣訪問數據庫外,還要決定如何處理數據庫的并行處理問題。下面來看一下,為什么并行處理問題那么重要,同時看一下可實現的選項
決策4:處理數據庫事務處理的并行問題
差不多所有的企業應用程序都需要多用戶和多個后臺進程并行的更新數據庫。2個數據庫 處理事務同時訪問同時訪問同一個數據是很正常的,但是這種情況很可能引起數據庫中的數據不一致或者引起應用程序的不正常。由于大部分的應用程序都需要處理多個處理事務并行訪問同一個數據,則它可以影響到業務和持久層的設計。
無論你是使用EJB還是輕量級構架,你的程序必須可以并行訪問共享數據。EJB2要求使用供應商提供的特殊擴充接口來實現并行,然而與此不同的是,JDO和Hibernate可以直接支持大部分并行機制。更重要的是,使用JDO和Hibernate不僅只配置簡單,而且只需要少量的代碼就可以實現了。
在這樣主要介紹幾種“并行更新數據庫處理事務”的選項的概要,這些事務處理和用戶的輸入無關。下一章,我主要介紹一下如何在應用程序級長時間的并行更新數據庫處理事務,這種處理事務會與用戶輸入有關,而且是由一系列的數據庫事務處理組成的。
獨立數據庫事務
有時候對共享數據的并行訪問可以簡單的依靠數據庫本身來實現,數據庫可以設置為執行孤立的數據——這只是對數據庫而言。如果你對這種概念不熟悉也不要擔心,你只要記。喝绻麘贸绦蚴褂猛耆墓铝⑹聞辗绞,那么同時執行2個事務的結果和一個接一個的執行是一樣的。(也就是說,如果你用孤立事務的方式來訪問數據庫的話,你同時執行2個事務,就會變成一個接一個的串行執行了。)
這種方法也許聽起來非常的簡單,但問題是這種處理方式有時候會降低性能,因為如何實現對事務的孤立是由數據庫來決定的。為了這個原因,許多應用程序都避免使用它,而采用optimistic或者pessimistic 所鎖,這會在下面講到。
開放式鎖定
并行更新數據的一種途徑是用開放式鎖定。開放式鎖定工作原理是通過應用程序來檢查數據是否被更新(被其他事務修改造成的)而實現的。一種更普通的實現開放式鎖定的方法是在每個表中添加一個“版本列”(version column),對每個表而言,程序每次改變其中一行的時候都會更新這個“版本列”。每個UPDATE語句中的WHERE語句會根據上次查詢的結果判斷這個版本號是不是被更改了。在事務訪問數據庫中的數據時,程序中可以用PreparedStatement.executeUpadte()這個函數的返回值來檢查行的個數,從而判斷是否要繼續執行UPDATE語句。如果數據中的行已經被其他的事務更新或者刪除了,那么程序會讓該事務從新訪問數據庫。
用開放式鎖定機制來鎖定那些直接執行SQL語句的應用程序是非常簡單的。但是,用持久層構架(比如JDO和Hibernate)實現更容易,因為他們已經提供了開放式鎖定機制——在配置選項中。一旦在配置選項中,選中了這種方式,持久層構架會自動的生成SQL的UPDATE語句來完成版本檢查的任務。開放式鎖定的名字來源于一種假設的情況,在這種情況下:并發更新的機會非常少,而且程序只能檢測、覆蓋這些數據而不能防止這種事情的發生。另外一種可選的途徑是用保守式鎖定,使用他的假設條件是:并發更新肯定會發生,而且必須被禁止。
文章來源于領測軟件測試網 http://www.k11sc111.com/