亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

技術分享 在Spring中實現事務掛起(圖)

2019-11-18 13:00:18
字體:
來源:轉載
供稿:網友

  摘要
  
  SPRing Framework是一個流行的java/J2EE應用框架,它構建于一個輕量級的反向控制(Inversion-of-Control,QoC)模式的容器的基礎之上,以其數據訪問和事務治理能力而著稱。Spring的聲明性事務劃分適用于任何的POJO(pure old java object或plain ordinary Java object,無格式普通Java對象)目標對象,其聲明性事務如同EJB容器托管事務(Container-Managed Transaction,CMT)一樣完善。后端事務治理器的選擇包括簡單的基于JDBC的事務和完善的J2EE事務(借助于JTA策略)。
  
  本文具體討論了Spring的事務治理功能。重點介紹了如何以JTA作為后端事務策略,使用Spring的針對POJO的聲明性事務。本文說明了Spring的事務服務可以與J2EE服務器的事務協調程序(如BEA WebLogic Server的事務協調程序)進行無縫交互,實際上已經成為EJB CMT的傳統事務劃分方式的替代方案。
  
  針對POJO的聲明性事務
  
  為了說明Spring的聲明性事務劃分方式,讓我們來看看Spring的PetClinic示例應用程序的中心服務外觀(facade)的配置:
  
  <bean id="dataSource"
  class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName">
  <value>java:comp/env/jdbc/petclinic</value>
  </property>
  </bean>
  <bean id="transactionManager"
  class="org.springframework.transaction.jta.JtaTransactionManager"/>
  
  <bean id="clinicTarget"
  class="org.springframework.samples.petclinic.jdbc.JdbcClinic">
  <property name="dataSource"><ref bean="dataSource"/></property>
  </bean>
  
  <bean id="clinic"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager"><ref bean="transactionManager"/></property>
  <property name="target"><ref bean="clinicTarget"/></property>
  <property name="transactionAttributes">
  <props>
  <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
  <prop key="store*">PROPAGATION_REQUIRED</prop>
  </props>
  </property>
  </bean>
  
  它遵從了Spring的標準xmlBean定義格式。它定義了:
  
  一個DataSource引用,指向一個JNDI位置--這將從J2EE服務器托管的JNDI環境中獲取指定的DataSource。
  
  一個PlatformTransactionManage實現--在本例中,該實現指定Spring的JtaTransactionManager,它委托給J2EE服務器的事務協調程序。
  
  應用程序服務實現--這是一個簡單的POJO,它封裝了業務和數據訪問邏輯。它實現應用程序的Clinic服務接口。
  
  一個應用程序服務的事務代理--該代理定義了目標服務的事務屬性,提供具體的方法命名模式,并創建相應的事務。對于實際的事務治理,代理指向PlatformTransactionManager實現。
  
  注重:Spring還通過通用屬性(Commons Attribute)或者J2SE 5.0的注釋(annotation),支持一種自動代理機制和對源級(source-level)元數據的使用,作為顯示代理定義的替代方案。這些替代方案不在本文的討論范圍之內;其具體資料請參考Spring說明文檔。
  
  使用的服務接口和服務實現是特定于應用程序的,無需了解Spring(具體說是Spring的事務治理)就可以實現。純Java對象可以用作目標對象,而任何一個純Java接口都可以用作服務接口。下面是一個Clinic接口的例子:
  
  public interface Clinic {
  Pet loadPet(int id);
  void storePet(Pet pet);
  ...
  }
  下面顯示了該接口的一個簡單實現,假定它使用JDBC來執行必要的數據訪問。它通過一個bean屬性的setter方法接收JDBC DataSource,這直接對應上面配置中的dataSource屬性定義。
  
  public class JdbcClinic implements Clinic {
  
  private DataSource dataSource;
  
  public void setDataSource(DataSource dataSource) {
  this.dataSource = dataSource;
  }
  
  public Pet loadPet(int id) {
  try {
  Connection con = this.dataSource.getConnection();
  ...
  }
  catch (SQLException ex) {
  ...
  }
  }
  
  public void storePet(Pet pet) {
  try {
  Connection con = this.dataSource.getConnection();
  ...
  }
  catch (SQLException ex) {
  ...
  }
  }
  
  ...
  }
  正如您所看到的,代碼簡單明了。使用了一個簡單Java對象。事務治理由事務代理處理,我們隨后再對其進行說明。
  
  注重,PetClinic示例應用程序中實際的基于JDBC的Clinic實現利用了Spring的JDBC支持類,以免只工作在簡單的JDBC API級別上。但是,Spring的事務治理還將使用簡單的基于JDBC的實現,比如上面的實現。
  
  定義事務代理
  
  除JdbcClinic實例之外,配置還為其定義了一個事務代理。假如需要,可以顯式地指定該事務代理所暴露的實際接口。默認狀態下,目標對象實現的所有接口都將被暴露--在本例中是應用程序的Clinic服務接口。
  
  從客戶端的角度來看,“clinic”bean只是應用程序的Clinic接口的實現。客戶端不必知道自己正在和事務代理打交道。這就是接口的力量:目標對象的直接引用可以很輕松地由實現了相同接口的代理取代--在本例中是一個隱式地創建事務的代理。
  
  對于特定的方法或方法命名模式,代理的具體事務行為由事務屬性驅動,如下面的例子所示:
  
  <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop><prop key="store*">PROPAGATION_REQUIRED</prop>
  
  key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:
  
  PROPAGATION_REQUIRED--支持當前事務,假如當前沒有事務,就新建一個事務。這是最常見的選擇。
  PROPAGATION_SUPPORTS--支持當前事務,假如當前沒有事務,就以非事務方式執行。
  PROPAGATION_MANDATORY--支持當前事務,假如當前沒有事務,就拋出異常。
  PROPAGATION_REQUIRES_NEW--新建事務,假如當前存在事務,把當前事務掛起。
  PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,假如當前存在事務,就把當前事務掛起。
  PROPAGATION_NEVER--以非事務方式執行,假如當前存在事務,則拋出異常。
  PROPAGATION_NESTED--假如當前存在事務,則在嵌套事務內執行。假如當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。
  
  前六個策略類似于EJB CMT:常量名相同,因此,對EJB開發人員來說,應該馬上就感到熟悉。第七個(PROPAGATION_NESTED)是Spring所提供的一個非凡變量。它要求事務治理器或者使用JDBC 3.0 Savepoint API提供嵌套事務行為(如Spring的DataSourceTransactionManager),或者通過JTA支持嵌套事務。
  
  事務屬性中的readOnly標志表示對應的事務應該被最優化為只讀事務。這是一個最優化提示。在一些情況下,一些事務策略能夠起到顯著的最優化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)時避免dirty checking(試圖“刷新”)。
  
  在事務屬性中還有定義“timeout”值的選項,指定事務超時為幾秒。在JTA中,這將被簡單地傳遞到J2EE服務器的事務協調程序,并據此得到相應的解釋。
  
  使用事務代理
  
  在運行時,客戶端將獲取到“clinic”bean的引用,將其轉換為Clinic接口,同時在它上面調用諸如loadPet或storePet之類的操作。這將隱式地使用在目標對象之前注冊的“事務攔截器”檢查Spring的事務代理;新的事務將被創建,然后調用將被委派給JdbcClinic目標方法。
  
  圖1說明了一個具有“advisor鏈”和終端目標的AOP代理的底層概念。其中,唯一的advisor就是將事務行為包裝到目標方法的事務攔截器。這是在Spring的聲明性事務功能的幫助下產生的基于代理的AOP(面向方面編程)。
  
 技術分享 在Spring中實現事務掛起(圖)
  圖1. 具有“advisor鏈”和終端目標的AOP代理

  
  例如,PetClinic web應用程序中的web層組件能夠執行ServletContext查詢操作來獲取對Spring WebapplicationContext的引用,然后獲得那里托管的“Clinic”bean:
  
  WebApplicationContext ctx =
  WebApplicationContexUtils.getWebApplicationContext(servletContext);
  Clinic clinic = (Clinic) ctx.getBean("clinic);
  
  Pet pet = new Pet();
  pet.setName("my new cat");
  
  clinic.storePet(pet);  在storePet()調用的開始,Spring的事務代理將隱式地創建一個事務。在storePet()調用返回時,將提交或回滾事務。默認情況下,任何RuntimeException或Error的拋出均會導致回滾。可以指定何時提交和何時回滾的實際規則:Spring的事務屬性支持一個稱為“回滾規則”的概念。
  
  例如,我們可以引入一個檢查性的PetClinicException,并告訴事務代理,在拋出該異常時執行進行回滾。
  
  <prop key="load*">PROPAGATION_REQUIRED,readOnly,-PetClinicException</prop>
  <

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性猛交xxxx免费看久久久| 欧美精品videos另类日本| 26uuu亚洲伊人春色| 97人人爽人人喊人人模波多| 久久99久国产精品黄毛片入口| 国产精品av免费在线观看| 成人午夜激情免费视频| 欧美一区二区三区免费观看| 欧美日韩一区二区在线播放| 国产噜噜噜噜噜久久久久久久久| 亚洲国产成人av在线| 欧美在线中文字幕| 在线观看国产精品淫| 国产精品嫩草视频| 亚洲国产女人aaa毛片在线| 精品国产依人香蕉在线精品| 国产成人福利网站| 欧美日韩国产精品一区二区不卡中文| 欧美日本高清视频| 亚洲专区中文字幕| 中文字幕欧美亚洲| 久热99视频在线观看| 亚洲精品99久久久久中文字幕| 久久中文字幕国产| 欧美区二区三区| 亚洲精品中文字幕女同| 日韩av在线免费观看| 国产精品女视频| 国产69精品久久久| 久久91精品国产| 日韩av免费在线看| 欧美午夜视频在线观看| 欧美日韩在线看| 欧美肥老妇视频| 亚洲综合大片69999| 亚洲国产欧美在线成人app| 欧美激情中文网| 91精品国产网站| 欧美成人精品三级在线观看| 91精品久久久久久久久久久久久久| 亚洲综合色激情五月| 国产精品自拍偷拍| 欧美性受xxxx黑人猛交| 色哟哟入口国产精品| 欧美激情18p| 亚洲人成电影网站色xx| 国产97在线视频| 国产精品三级久久久久久电影| 欧美色欧美亚洲高清在线视频| 国产在线视频一区| 国产99久久精品一区二区| 色av中文字幕一区| 日韩美女在线观看一区| 一区二区三区亚洲| 国产欧美精品一区二区| 久久久久久久久中文字幕| 粉嫩老牛aⅴ一区二区三区| 久久久久久久久国产精品| 欧美成人精品一区| 亚洲自拍另类欧美丝袜| www高清在线视频日韩欧美| 一个色综合导航| 久久国产精品久久久久| 国产日韩中文在线| 国产精品一区二区三区毛片淫片| 亚洲色图15p| 亚洲国产精品久久久久秋霞不卡| 久久精品一本久久99精品| 亚洲天堂男人天堂女人天堂| 国产精品一区二区三区毛片淫片| 992tv成人免费视频| 国产69精品99久久久久久宅男| 日韩电影在线观看永久视频免费网站| 成人网在线免费观看| 欧美电影第一页| 欧美日韩第一页| 亚洲剧情一区二区| 丰满岳妇乱一区二区三区| 国产日产久久高清欧美一区| 久久精品中文字幕一区| 国产成人97精品免费看片| 欧美性在线观看| 久久精品国产96久久久香蕉| www国产精品com| 中文字幕一精品亚洲无线一区| 尤物tv国产一区| 精品国产91久久久久久| 国产精品吴梦梦| 日韩人在线观看| 国产精品久久久91| 亚洲免费高清视频| 亚洲人成电影网站色www| 亚洲欧美日本伦理| 最近2019年手机中文字幕| 2021久久精品国产99国产精品| 91免费欧美精品| 日韩av电影在线网| 青草热久免费精品视频| 国产精品你懂得| 国产精品视频资源| 欧美一级淫片aaaaaaa视频| 欧美日韩中文字幕在线视频| 久久影视电视剧免费网站| 欧美精品成人91久久久久久久| 亚洲精品一区中文字幕乱码| 国产精品wwwwww| 欧美一区二区.| 日韩欧美成人精品| 欧美激情一级精品国产| 一本一道久久a久久精品逆3p| 国产精品嫩草影院一区二区| 在线视频欧美性高潮| 国产精品jvid在线观看蜜臀| 久久伊人免费视频| 亚洲成色777777在线观看影院| 亚洲第一福利视频| 久久久精品999| 欧美日韩国产黄| 亚洲人成在线免费观看| 日本三级韩国三级久久| 97视频免费观看| 亚洲一区二区三区视频| 欧美性xxxxxxx| 久热精品在线视频| 精品亚洲国产视频| 亚洲国产高清高潮精品美女| 国产精品视频免费观看www| 91精品国产亚洲| 欧美成人免费全部| 91精品国产91久久久久久不卡| 亚洲欧美精品一区二区| 日韩精品免费在线视频| 亚洲欧美国产精品va在线观看| 欧美日产国产成人免费图片| 91精品国产91久久久久久久久| 日韩av中文字幕在线播放| 美女久久久久久久| 欧美性生活大片免费观看网址| 日本亚洲欧洲色α| 操91在线视频| 亚洲图片制服诱惑| 2020国产精品视频| 日韩动漫免费观看电视剧高清| 欧美亚洲成人精品| 亚洲美女av在线播放| 日韩中文字幕精品视频| 77777少妇光屁股久久一区| 在线观看欧美成人| 亚洲第一综合天堂另类专| 色777狠狠综合秋免鲁丝| 欧美视频精品一区| 欧美体内谢she精2性欧美| 国产精品美女呻吟| 亚洲国产成人久久综合一区| 欧美激情在线视频二区| 久久久久亚洲精品成人网小说| 国产精品在线看| 欧美日韩人人澡狠狠躁视频| 久久久女人电视剧免费播放下载| 色先锋资源久久综合5566| 国产精品久久久久免费a∨| 亚洲白拍色综合图区| 一本大道久久加勒比香蕉| 久久久久久久久网站|