最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring聲明式事務(wù)解析

 更新時(shí)間:2016年10月25日 15:27:19   作者:woonu  
這篇文章主要為大家詳細(xì)介紹了spring聲明式事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、spring聲明式事務(wù)

1.1 spring的事務(wù)管理器

spring沒(méi)有直接管理事務(wù),而是將管理事務(wù)的責(zé)任委托給JTA或相應(yīng)的持久性機(jī)制所提供的某個(gè)特定平臺(tái)的事務(wù)實(shí)現(xiàn)。spring容器負(fù)責(zé)事物的操作,spring容器充當(dāng)切面,事務(wù)的方法稱為增強(qiáng)處理,生成的代理對(duì)象的方法就是目標(biāo)方法+增強(qiáng)也就是crud+事務(wù)程序員只用做crud的操作,也就是目標(biāo)方法和聲明哪些方法應(yīng)該在事務(wù)中運(yùn)行。

Spring提供了許多內(nèi)置事務(wù)管理器實(shí)現(xiàn):

DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,數(shù)據(jù)源事務(wù)管理器,提供對(duì)單個(gè)javax.sql.DataSource事務(wù)管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事務(wù)管理;
JdoTransactionManager:位于org.springframework.orm.jdo包中,提供對(duì)單個(gè)javax.jdo.PersistenceManagerFactory事務(wù)管理,用于集成JDO框架時(shí)的事務(wù)管理;
JpaTransactionManager:位于org.springframework.orm.jpa包中,提供對(duì)單個(gè)javax.persistence.EntityManagerFactory事務(wù)支持,用于集成JPA實(shí)現(xiàn)框架時(shí)的事務(wù)管理;
HibernateTransactionManager:位于org.springframework.orm.hibernate3包中,提供對(duì)單個(gè)org.hibernate.SessionFactory事務(wù)支持,用于集成Hibernate框架時(shí)的事務(wù)管理;該事務(wù)管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
JtaTransactionManager:位于org.springframework.transaction.jta包中,提供對(duì)分布式事務(wù)管理的支持,并將事務(wù)管理委托給Java EE應(yīng)用服務(wù)器事務(wù)管理器;
OC4JjtaTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的對(duì)OC4J10.1.3+應(yīng)用服務(wù)器事務(wù)管理器的適配器,此適配器用于對(duì)應(yīng)用服務(wù)器提供的高級(jí)事務(wù)的支持;
WebSphereUowTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的對(duì)WebSphere 6.0+應(yīng)用服務(wù)器事務(wù)管理器的適配器,此適配器用于對(duì)應(yīng)用服務(wù)器提供的高級(jí)事務(wù)的支持;
WebLogicJtaTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的對(duì)WebLogic 8.1+應(yīng)用服務(wù)器事務(wù)管理器的適配器,此適配器用于對(duì)應(yīng)用服務(wù)器提供的高級(jí)事務(wù)的支持。
Spring不僅提供這些事務(wù)管理器,還提供對(duì)如JMS事務(wù)管理的管理器等,Spring提供一致的事務(wù)抽象如圖所示

spring與hibernate

說(shuō)明:

spring在調(diào)用具體的事務(wù)管理器之前做了一些準(zhǔn)備工作,提前設(shè)置事務(wù)的讀寫策略,而這些事務(wù)策略是公共的東西,是寫在spring的配置文件中的,這些內(nèi)容的處理需要放在抽象類中去做

二、spring與hibernate整合中的事務(wù)處理

1.2 以xml形式
引入properties配置文件

 <property name="locations"> 
   <value>classpath:jdbc.properties</value> 
 </property> 

配置dbcp數(shù)據(jù)源

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
 </bean> 

引入sessionfactory,使用hibernate外部配置文件

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
    </property> 
</bean> 

注入dao和service層

  <bean id="personDao" class="cn.qjc.hibernate.dao.impl.PersonDaoImpl"> 
    <property name="sessionFactory"> 
      <ref bean="sessionFactory2"/> 
    </property> 
  </bean> 
   
  <bean id="personService" class="cn.qjc.hibernate.service.impl.PersonServiceImpl"> 
    <property name="personDao"> 
      <ref bean="personDao"/> 
    </property> 
  </bean>

 配置hibernate事務(wù)管理器

  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
      <ref bean="sessionFactory2"/> 
    </property> 
   </bean> 

配置聲明式事務(wù)

作用:

  1、告訴spring容器事務(wù)管理器

  2、告訴spring容器什么樣的方法使用什么樣的事務(wù)

  <tx:advice transaction-manager="transactionManager" id="tx"> 
    <tx:attributes> 
      <!--  
        name 目標(biāo)方法的范圍 
        islation 隔離級(jí)別 
        propagation 傳播屬性       
        read-only 
          true 只讀事務(wù) 
          false 讀寫事務(wù) 
       --> 
      <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> 
    </tx:attributes> 
   </tx:advice> 

配置切入點(diǎn)

  <aop:config> 
    <aop:pointcut expression="execution(* cn.qjc.hibernate.service.impl.*.*(..))" id="perform"/> 
      <span style="white-space:pre"> </span><!-- 將切入點(diǎn)應(yīng)用到增強(qiáng)方法 --> 
    <aop:advisor advice-ref="tx" pointcut-ref="perform"/> 
   </aop:config> 

dao實(shí)現(xiàn)類

 * 實(shí)現(xiàn)方法一:繼承HibernateDaoSupport 
 * @author qjc 
 */ 
public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao{ 
 
  @Override 
  public void savePerson(Person person) { 
    this.getHibernateTemplate().save(person); 
  } 
} 

測(cè)試

...

注意:

1、如果一個(gè)DAO類繼承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了。

2、如果一個(gè)DAO類沒(méi)有繼承HibernateDaoSupport,需要有一個(gè)SessionFactory的屬性,并且在配置文件中進(jìn)行注入。

  <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory" ref="sessionFactory2"></property> 
  </bean> 

1.2 以注解形式

1、在配置文件中應(yīng)用spring的自動(dòng)掃描機(jī)制

<context:component-scan base-package="cn.qjc"/>

2、在配置文件中引入注解解析器

<tx:annotation-driven transaction-manager="transactionManager"/>

3、在service層通過(guò)@Transaction進(jìn)行注解 

注意:如果在類級(jí)別上被注解為只讀事務(wù),但是這個(gè)類中的方法中@Transaction注解的事務(wù)設(shè)置將優(yōu)先于類級(jí)別注解的事務(wù)設(shè)置。

1.3 spring事務(wù)的傳播屬性

  required: 業(yè)務(wù)方法需要在一個(gè)事務(wù)中運(yùn)行。如果方法運(yùn)行時(shí),已經(jīng)處在一個(gè)事務(wù)中,那么加入到該事務(wù),否則為自己創(chuàng)建一個(gè)新事務(wù)(默認(rèn))

  not-supported:spring容器不開啟事務(wù),如果方法在一個(gè)事務(wù)中被調(diào)用,該事務(wù)會(huì)被掛起,該方法結(jié)束后,事務(wù)恢復(fù)

  requiresnew:不管是否存在事務(wù),業(yè)務(wù)方法總會(huì)創(chuàng)建一個(gè)新事務(wù)。

  mandatorky: 業(yè)務(wù)方法只能在一個(gè)已經(jīng)存在的事務(wù)中執(zhí)行,如果業(yè)務(wù)方法在沒(méi)有事務(wù)下調(diào)用,容器拋出例外。

此外還有supports、never、nested等屬性,但是通常使用默認(rèn)

propagation="required" 此配置可以解決事務(wù)嵌套問(wèn)題,何為事務(wù)嵌套?

比如:

在工作流框架和操作service層的某個(gè)方法中都存在事務(wù),service層也有自己的事務(wù),當(dāng)service執(zhí)行的時(shí)候,就會(huì)出現(xiàn)事務(wù)嵌套,即方法本身有事務(wù),方法中的方法還有事務(wù),這就是事務(wù)嵌套。而spring通過(guò)事務(wù)傳播屬性propagation="required"解決了這一問(wèn)題。

 1.4 OpenInSessionView

在s2sh整合以后,spring管理事務(wù),由于使用的是spring的聲明式事務(wù)處理方式,所以在調(diào)用this.getHibernateTemplate()這個(gè)方法執(zhí)行完之后,session立即關(guān)閉,如果當(dāng)前執(zhí)行的方法有事務(wù),當(dāng)事務(wù)環(huán)境的方法被調(diào)用完畢后session關(guān)閉。所以當(dāng)值在頁(yè)面輸出時(shí)會(huì)產(chǎn)生異常。

處理方式為:OpenSessionInview模式(web.xml中配置)

<filter> 
  <filter-name>hibernateFilter</filter-name> 
  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
   
  <!-- singleSession默認(rèn)為true,若設(shè)置為false則等于沒(méi)有OpenSessionInView --> 
  <init-param> 
    <param-name>singleSession</param-name> 
    <param-value>true</param-value> 
  </init-param> 
 </filter> 

 <filter-mapping> 
  <filter-name>hibernateFilter</filter-name> 
  <url-pattern>/PersonService</url-pattern>   
 </filter-mapping> 

從上面代碼可以看出,當(dāng)提交一個(gè)請(qǐng)求時(shí),OpenSessionInView中已經(jīng)把session開啟了,在response以后才要關(guān)閉session,也就意味著有了openSessionInView必須在struts2的過(guò)濾器之前。(放struts2過(guò)濾器位置上面) 

但是開啟OpenSessionInView也有缺點(diǎn):因?yàn)閟ession關(guān)閉被延后了,而hibernate的一級(jí)緩存在session中,所以會(huì)導(dǎo)致大量的緩存中的數(shù)據(jù)被長(zhǎng)時(shí)間停留在內(nèi)存中。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC路徑匹配中使用通配符問(wèn)題

    SpringMVC路徑匹配中使用通配符問(wèn)題

    這篇文章主要介紹了SpringMVC路徑匹配中使用通配符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實(shí)現(xiàn)屏幕截圖工具的代碼分享

    Java實(shí)現(xiàn)屏幕截圖工具的代碼分享

    這篇文章主要為大家介紹了如何利用Java語(yǔ)言編寫一個(gè)電腦屏幕截圖工具,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-05-05
  • java實(shí)現(xiàn)砸金蛋抽獎(jiǎng)功能

    java實(shí)現(xiàn)砸金蛋抽獎(jiǎng)功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)砸金蛋抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • RocketMQ?producer發(fā)送者淺析

    RocketMQ?producer發(fā)送者淺析

    RocketMQ生產(chǎn)者是一種高性能、可靠的消息發(fā)送者,能夠?qū)⑾⒖焖?、可靠地發(fā)送到RocketMQ消息隊(duì)列中。它具有多種消息發(fā)送模式和消息發(fā)送方式,可以根據(jù)不同的業(yè)務(wù)需求進(jìn)行靈活配置
    2023-04-04
  • IDEA?2022.1.4用前注意事項(xiàng)

    IDEA?2022.1.4用前注意事項(xiàng)

    這篇文章主要介紹了IDEA?2022.1.4用前注意事項(xiàng),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • SpringMVC執(zhí)行過(guò)程詳細(xì)講解

    SpringMVC執(zhí)行過(guò)程詳細(xì)講解

    MVC是一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)組件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫業(yè)務(wù)邏輯,MVC分層有助于管理和架構(gòu)復(fù)雜的應(yīng)用程序
    2022-08-08
  • 監(jiān)控Spring Boot 項(xiàng)目運(yùn)行情況操作方法

    監(jiān)控Spring Boot 項(xiàng)目運(yùn)行情況操作方法

    在實(shí)際開發(fā)中,經(jīng)常會(huì)遇到想要獲取到服務(wù)器應(yīng)用的運(yùn)行情況的場(chǎng)景,在微服務(wù)架構(gòu)下對(duì)于每個(gè)應(yīng)用運(yùn)行情況的監(jiān)控是保證系統(tǒng)高可用的關(guān)鍵,本文給大家介紹如何實(shí)現(xiàn)在Spring Boot的jar包中對(duì)系統(tǒng)的運(yùn)行情況進(jìn)行監(jiān)控操作,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java不可不知的泛型使用示例代碼

    Java不可不知的泛型使用示例代碼

    這篇文章主要介紹了Java不可不知的泛型使用,本文通過(guò)實(shí)例代碼給大家介紹了java的泛型的基本使用,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • IntelliJ?IDEA運(yùn)行SpringBoot項(xiàng)目的詳細(xì)步驟

    IntelliJ?IDEA運(yùn)行SpringBoot項(xiàng)目的詳細(xì)步驟

    這篇文章主要介紹了IntelliJ?IDEA如何運(yùn)行SpringBoot項(xiàng)目,步驟一配置maven,步驟二配置JDK環(huán)境,緊接著通過(guò)步驟三檢查數(shù)據(jù)庫(kù)的配置,最后一步數(shù)據(jù)庫(kù)連接,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Java實(shí)現(xiàn)統(tǒng)計(jì)字符串出現(xiàn)的次數(shù)

    Java實(shí)現(xiàn)統(tǒng)計(jì)字符串出現(xiàn)的次數(shù)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)統(tǒng)計(jì)字符串出現(xiàn)的次數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論

龙山县| 巴中市| 广平县| 延安市| 察哈| 尖扎县| 盐池县| 德格县| 中西区| 安龙县| 马边| 屏山县| 边坝县| 渑池县| 德令哈市| 密山市| 兰考县| 西青区| 织金县| 察隅县| 沾化县| 嫩江县| 普兰县| 桦南县| 余庆县| 海安县| 贡嘎县| 娱乐| 龙州县| 康平县| 上饶县| 天镇县| 新兴县| 东乡县| 揭西县| 阿巴嘎旗| 汝城县| 蓬安县| 理塘县| 碌曲县| 道真|