小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SPRING事務管理

 々心寒々 2010-02-05

  前段時間對Spring的事務配置做了比較深入的研究,在此之間對Spring的事務配置雖說也配置過,但是一直沒有一個清楚的認識。通過這次的學習發(fā)覺Spring的事務配置只要把思路理清,還是比較好掌握的。

    總結(jié)如下:

    Spring配置文件中關(guān)于事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。

DataSource、TransactionManager這兩部分只是會根據(jù)數(shù)據(jù)訪問方式有所變化,比如使用Hibernate進行數(shù)據(jù)訪問時,DataSource實際為SessionFactoryTransactionManager的實現(xiàn)為HibernateTransactionManager。

 根據(jù)代理機制的不同,總結(jié)了五種Spring事務的配置方式,配置文件如下:

    第一種方式:每個Bean都有一個代理

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
    xmlns:xsi
="http://www./2001/XMLSchema-instance"
    xmlns:context
="http://www./schema/context"
    xmlns:aop
="http://www./schema/aop"
    xsi:schemaLocation
="http://www./schema/beans
           http://www./schema/beans/spring-beans-2.5.xsd
           http://www./schema/context
           http://www./schema/context/spring-context-2.5.xsd
           http://www./schema/aop http://www./schema/aop/spring-aop-2.5.xsd">


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

   
<!-- 定義事務管理器(聲明式的事務) --> 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean>
   
   
<!-- 配置DAO -->
   
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean>
   
   
<bean id="userDao" 
        class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
          
<!-- 配置事務管理器 --> 
          
<property name="transactionManager" ref="transactionManager" />    
       
<property name="target" ref="userDaoTarget" /> 
        
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
       
<!-- 配置事務屬性 --> 
       
<property name="transactionAttributes"> 
           
<props> 
               
<prop key="*">PROPAGATION_REQUIRED</prop>
           
</props> 
       
</property> 
   
</bean> 
</beans>

    第二種方式:所有Bean共享一個代理基類

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
    xmlns:xsi
="http://www./2001/XMLSchema-instance"
    xmlns:context
="http://www./schema/context"
    xmlns:aop
="http://www./schema/aop"
    xsi:schemaLocation
="http://www./schema/beans
           http://www./schema/beans/spring-beans-2.5.xsd
           http://www./schema/context
           http://www./schema/context/spring-context-2.5.xsd
           http://www./schema/aop http://www./schema/aop/spring-aop-2.5.xsd">


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

   
<!-- 定義事務管理器(聲明式的事務) --> 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean>
   
   
<bean id="transactionBase" 
            class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
            lazy-init
="true" abstract="true"> 
       
<!-- 配置事務管理器 --> 
       
<property name="transactionManager" ref="transactionManager" /> 
       
<!-- 配置事務屬性 --> 
       
<property name="transactionAttributes"> 
           
<props> 
               
<prop key="*">PROPAGATION_REQUIRED</prop> 
           
</props> 
       
</property> 
   
</bean>   
  
   
<!-- 配置DAO -->
   
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean>
   
   
<bean id="userDao" parent="transactionBase" > 
       
<property name="target" ref="userDaoTarget" />  
   
</bean>
</beans>

第三種方式:使用攔截器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
    xmlns:xsi
="http://www./2001/XMLSchema-instance"
    xmlns:context
="http://www./schema/context"
    xmlns:aop
="http://www./schema/aop"
    xsi:schemaLocation
="http://www./schema/beans
           http://www./schema/beans/spring-beans-2.5.xsd
           http://www./schema/context
           http://www./schema/context/spring-context-2.5.xsd
           http://www./schema/aop http://www./schema/aop/spring-aop-2.5.xsd">


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

   
<!-- 定義事務管理器(聲明式的事務) --> 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean> 
  
   
<bean id="transactionInterceptor" 
        class
="org.springframework.transaction.interceptor.TransactionInterceptor"> 
       
<property name="transactionManager" ref="transactionManager" /> 
       
<!-- 配置事務屬性 --> 
       
<property name="transactionAttributes"> 
           
<props> 
               
<prop key="*">PROPAGATION_REQUIRED</prop> 
           
</props> 
       
</property> 
   
</bean>
     
   
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
       
<property name="beanNames"> 
           
<list> 
               
<value>*Dao</value>
           
</list> 
       
</property> 
       
<property name="interceptorNames"> 
           
<list> 
               
<value>transactionInterceptor</value> 
           
</list> 
       
</property> 
   
</bean> 
 
   
<!-- 配置DAO -->
   
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean>
</beans>

第四種方式:使用tx標簽配置的攔截器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
    xmlns:xsi
="http://www./2001/XMLSchema-instance"
    xmlns:context
="http://www./schema/context"
    xmlns:aop
="http://www./schema/aop"
    xmlns:tx
="http://www./schema/tx"
    xsi:schemaLocation
="http://www./schema/beans
           http://www./schema/beans/spring-beans-2.5.xsd
           http://www./schema/context
           http://www./schema/context/spring-context-2.5.xsd
           http://www./schema/aop http://www./schema/aop/spring-aop-2.5.xsd
           http://www./schema/tx http://www./schema/tx/spring-tx-2.5.xsd">


   
<context:annotation-config />
   
<context:component-scan base-package="com.bluesky" />

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

   
<!-- 定義事務管理器(聲明式的事務) --> 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean>

   
<tx:advice id="txAdvice" transaction-manager="transactionManager">
       
<tx:attributes>
           
<tx:method name="*" propagation="REQUIRED" />
       
</tx:attributes>
   
</tx:advice>
   
   
<aop:config>
       
<aop:pointcut id="interceptorPointCuts"
            expression
="execution(* com.bluesky.spring.dao.*.*(..))" />
       
<aop:advisor advice-ref="txAdvice"
            pointcut-ref
="interceptorPointCuts" />       
   
</aop:config>     
</beans>

第五種方式:全注解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
    xmlns:xsi
="http://www./2001/XMLSchema-instance"
    xmlns:context
="http://www./schema/context"
    xmlns:aop
="http://www./schema/aop"
    xmlns:tx
="http://www./schema/tx"
    xsi:schemaLocation
="http://www./schema/beans
           http://www./schema/beans/spring-beans-2.5.xsd
           http://www./schema/context
           http://www./schema/context/spring-context-2.5.xsd
           http://www./schema/aop http://www./schema/aop/spring-aop-2.5.xsd
           http://www./schema/tx http://www./schema/tx/spring-tx-2.5.xsd">


   
<context:annotation-config />
   
<context:component-scan base-package="com.bluesky" />

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

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

   
<!-- 定義事務管理器(聲明式的事務) --> 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
</bean>
   
</beans>

此時在DAO上需加上@Transactional注解,如下:

package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

   
public List<User> listUsers() {
       
return this.getSession().createQuery("from User").list();
    }
   
   
}

 

 

Spring事務原理

統(tǒng)觀spring事務,圍繞著兩個核心PlatformTransactionManagerTransactionStatus

spring
提供了幾個關(guān)于事務處理的類: 
TransactionDefinition //
事務屬性定義
TranscationStatus //
代表了當前的事務,可以提交,回滾。
PlatformTransactionManager
這個是spring提供的用于管理事務的基礎(chǔ)接口,其下有一個實現(xiàn)的抽象類AbstractPlatformTransactionManager,我們使用的事務管理類例如DataSourceTransactionManager等都是這個類的子類。

一般事務定義步驟:

TransactionDefinition td = new TransactionDefinition();

TransactionStatus ts = transactionManager.getTransaction(td);

try

{ //do sth

  transactionManager.commit(ts);

}

catch(Exception e){transactionManager.rollback(ts);}

 


spring
提供的事務管理可以分為兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重復的代碼比較多;聲明式的比編程式的更靈活。

編程式主要使用transactionTemplate。省略了部分的提交,回滾,一系列的事務對象定義,需注入事務管理對象.

void add()

{

    transactionTemplate.execute( new TransactionCallback(){

        pulic Object doInTransaction(TransactionStatus ts)

       { //do sth}

    }

}


聲明式:

使用TransactionProxyFactoryBean:

<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager"><ref bean="transactionManager"/></property>
  <property name="target"><ref local="userManagerTarget"/></property>
  <property name="transactionAttributes">
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>


圍繞Poxy的動態(tài)代理 能夠自動的提交和回滾事務
org.springframework.transaction.interceptor.TransactionProxyFactoryBean

·                               PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

·                               PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。

·                               PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。

·                               PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。

·                               PROPAGATION_NOT_SUPPORTED--以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。

·                               PROPAGATION_NEVER--以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。

·                               PROPAGATION_NESTED--如果當前存在事務,則在嵌套事務內(nèi)執(zhí)行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。

HttpGet/Post請求區(qū)別

1HTTP請求格式:

<request line>

<headers>

<blank line>

[<request-body>]

HTTP請求中,第一行必須是一個請求行(request line),用來說明請求類型、要訪問的資源以及使用的HTTP版本。緊接著是一個首部(header)小節(jié),用來說明服務器要使用的附加信息。在首部之后是一個空行,再此之后可以添加任意的其他數(shù)據(jù)[稱之為主體(body]

2GETPOST區(qū)別

HTTP定義了與服務器交互的不同方法,最基本的方法是 GET POST.

HTTP-GETHTTP-POST是使用HTTP的標準協(xié)議動詞,用于編碼和傳送變量名/變量值對參數(shù),并且使用相關(guān)的請求語義。每個HTTP-GETHTTP-POST都由一系列HTTP請求頭組成,這些請求頭定義了客戶端從服務器請求了什么,而響應則是由一系列HTTP應答頭和應答數(shù)據(jù)組成,如果請求成功則返回應答。
  HTTP-GET以使用MIME類型application/x-www-form-urlencodedurlencoded文本的格式傳遞參數(shù)。Urlencoding是一種字符編碼,保證被傳送的參數(shù)由遵循規(guī)范的文本組成,例如一個空格的編碼是"%20"。附加參數(shù)還能被認為是一個查詢字符串。
  與HTTP-GET類似,HTTP-POST參數(shù)也是被URL編碼的。然而,變量名/變量值不作為URL的一部分被傳送,而是放在實際的HTTP請求消息內(nèi)部被傳送。

1get從服務器上獲取數(shù)據(jù),post向服務器傳送數(shù)據(jù)。

1   在客戶端,Get方式在通過URL提交數(shù)據(jù),數(shù)據(jù)URL可以看到;POST方式,數(shù)據(jù)放置在HTML HEADER內(nèi)提交。

2 對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request.Form獲取提交的數(shù)據(jù)。

2   GET方式提交的數(shù)據(jù)最多只能有1024字節(jié),而POST沒有此限制。

3   安全性問題。正如在(1)中提到,使用 Get 的時候,參數(shù)會顯示在地址欄上,而 Post 不會。所以,如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是非敏感數(shù)據(jù),那么使用 get;如果用戶輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù),那么還是使用 post為好。

注:所謂安全的意味著該操作用于獲取信息而非修改信息。冪等的意味著對同一 URL 的多個請求應該返回同樣的結(jié)果。完整的定義并不像看起來那樣嚴格。換句話說,GET 請求一般不應產(chǎn)生副作用。從根本上講,其目標是當用戶打開一個鏈接時,她可以確信從自身的角度來看沒有改變資源。比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。反之亦然。POST 請求就不那么輕松了。POST 表示可能改變服務器上的資源的請求。仍然以新聞站點為例,讀者對文章的注解應該通過 POST 請求實現(xiàn),因為在注解提交之后站點已經(jīng)不同了(比方說文章下面出現(xiàn)一條注解)。

下面舉一個簡單的例子來說明它們的區(qū)別:

<!-分別通過getpost方式提交表單-->
<FORM ACTION="getpost.asp" METHOD="get">
<INPUT TYPE="text" NAME="Text" VALUE="
http://wxf0701.cnblogs.com//>
<INPUT TYPE="submit" VALUE="Get
方式"></INPUT>
</FORM>
<BR>
<FORM ACTION="getpost.asp" METHOD="post">
<INPUT TYPE="text" NAME="Text" VALUE="
http://wxf0701.cnblogs.com/>
<INPUT TYPE="submit" VALUE="Post
方式"></INPUT>
</FORM>
<BR>

<% If Request.QueryString("Text") <> "" Then %>
通過get方式傳遞的字符串是: "<B><%= Request.QueryString("Text") %></B>"<BR>
<% End If %>

<% If Request.Form("Text") <> "" Then %>
通過Post方式傳遞的字符串是: "<B><%= Request.Form("Text") %></B>"<BR>
<% End If %>

享元模式

 

有和多個小的對象它們有很多屬性相同,把它們變成一個對象,把不同的屬性變成

方法的參數(shù)稱之為外部狀態(tài),相同的屬性稱之為這個對象的內(nèi)部狀態(tài)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多