WebLogic Server中CMP實體bean的性能調優[3]

發表于:2008-08-25來源:作者:點擊數: 標簽:
樂觀并發 樂觀并發策略通過消除讀取和更新操作之間 數據庫 中的所有鎖定解決了 性能 問題,同時還提供了檢測更新丟失的機制。和數據庫并發一樣,樂觀并發給每個事務一個自己的bean實例,但是它沒有在事務進行過程中在EJB容器或數據庫中包含任何鎖。對于進行讀
樂觀并發

  樂觀并發策略通過消除讀取和更新操作之間數據庫中的所有鎖定解決了性能問題,同時還提供了檢測更新丟失的機制。和數據庫并發一樣,樂觀并發給每個事務一個自己的bean實例,但是它沒有在事務進行過程中在EJB容器或數據庫中包含任何鎖。對于進行讀鎖定的數據庫(非Oracle數據庫),容器在一個單獨的事務(該事務在數據讀取操作一完成就立即進行)中讀取bean數據,從而避免了讀取鎖,并且提供了更高的可伸縮性。

  這種更新丟失檢測機制并不新鮮,在Java創建之前就已經存在好長時間了。該模式的基本思想簡單而強大:在更新時,首先進行檢查,以確定表中的數據在被第一個進程讀取之后是否被其他進程修改。實際中,這通常是通過在update語句的where子句中包含一個或多個額外的“版本”列來實現的。下面給出了一個簡單的SQL的例子,其中version列是一個數值,在每次更新操作之后會遞增:

-- at Entity load time"container executes select of bean fields,
-- plus 'version' field
select name, address, version from person where person_id = 1;
-- container remember value read from version column,
-- say it was 123
 
-- at update time, value of version which was read previously
-- added to the where clause and version incremented
update person set name='Joe', version = version + 1 where person_id = 1 and version = 123;


  在進行更新時,容器通過執行以下代碼能檢測出數據庫中實際上有多少行被更新:

...
PreparedStatement ps =
       connection.prepareStatement('update person...');
int rowsUpdated = ps.executeUpdate();
if (rowsUpdatated != 1) {
    throw new OptimisticConcurrencyException('Data was modified by other process');
}


  如您所見,該方法可使服務器避免更新丟失問題,并且不需要在容器或數據庫中進行長期的鎖定。該策略尤其適用于數據庫中讀取次數遠多于更新次數,因此更新碰撞的幾率很小時。通常,對于大部分應用程序來說是這樣的。

  一個用數字表示的版本列不是在WebLogic Server中實現樂觀并發策略的唯一途徑。相反可以使用一個時間戳列。(注意,數據庫應該允許您存放足夠精確的時間戳值)。時間戳的使用給您帶來了額外好處,那就是知道記錄的最后一次更新是什么時候。有時候在使用遺留數據庫模式時,會不愿意或不可能更改數據表以添加一個版本列。這種情況下,WebLogic Server可以檢查表中事務期間被讀取的所有列(實體bean中的所有字段),或者只檢查被當前事務更新的列。樂觀并發可用于遺留模式,無需對數據表進行任何修改,但是開銷略微增加(意味著更復雜的SQL更新)。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97