stateless session bean中跨數據庫的事務的維持

      在上一篇blog中我寫到了一個困饒我的問題,就是如何在stateless session bean中的一個方法內如果有多個數據庫操作,怎樣維持它們的事務性,經過實驗,下面給出它的一種解決方法。
首先像這樣的問題我們應該相信ejb是能夠解決的,因爲ejb的事務機制是很強大的,而上述的問題並不是很特殊的情況,而是種普遍的情形。怎樣解決了,其實也是很簡單的,但這裏有個前提,就是你的數據庫操作中的數據庫連接不能用simple的jdbc連接(這也是爲什麼我開始的demo總是不行的原因),必須要用連接池來獲得connection,原因我後面再說,當我們進行跨數據庫的操作時,每一個dao的操作我們必須要拋出異常,即在dao中我們的操作方法遇到異常時,在catch部分處理掉了異常後,要再拋出一個異常(任意的都可以,其實也可以在dao中不捕獲異常,直接讓異常到上一層),這樣異常就會傳到session bean的方法中,然後session bean再捕獲它,在session bean 的方法的catch部分加上sessionContext.setRollbackOnly()這樣就能做到整體操作的事務一致性的維護了。
      我感覺這裏面的實際情況還是用到了ejb容器提供的強大的事務性機制,只是我們要讓異常得以通知到ejb容器,然後在catch部分實現回滾。至於爲什麼非要用數據源了,我感覺是因爲在數據源中當我將connection.close()是有可能並沒有真正的close()(數據源是有優化的,所以它還可能保留了連接的信息),而simple的jdbc可能要是close()就真正的close了,但這只是猜測!
     當然ejb的聲明性事務處理還要再學習學習,這也是它強大的一個地方,感覺與spring的有幾分相似!
 
發佈了34 篇原創文章 · 獲贊 0 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章