<strike id="9fxl7"></strike>
<ruby id="9fxl7"><dl id="9fxl7"></dl></ruby>
<strike id="9fxl7"><dl id="9fxl7"></dl></strike>
<ruby id="9fxl7"><i id="9fxl7"><cite id="9fxl7"></cite></i></ruby>
<th id="9fxl7"></th>
<ruby id="9fxl7"><ins id="9fxl7"></ins></ruby>
<strike id="9fxl7"></strike>
<span id="9fxl7"><dl id="9fxl7"></dl></span>
<progress id="9fxl7"></progress><span id="9fxl7"></span>
<strike id="9fxl7"></strike>
<ruby id="9fxl7"><dl id="9fxl7"><del id="9fxl7"></del></dl></ruby>
<strike id="9fxl7"><i id="9fxl7"><del id="9fxl7"></del></i></strike><strike id="9fxl7"><dl id="9fxl7"><del id="9fxl7"></del></dl></strike>
?
企業管理及信息化解決方案;--因為專注,所以專業!
客服熱線:028-86272612
成都藍源 -> > EDP資訊 -> 詳細內容
Lanyo EDP中的事務問題
時間: 2011-12-07    來源:

先來回顧一下在傳統SSH項目中的事務控制策略。在傳統SSH中,使用org.springframework.orm.hibernate3.support.OpenSessionInViewFilter來打開session,然后使用聲明式事務配置,不管是采用XML的或者是Annotation的,事務邊界都開在service服務上。

    但是在EDP的應用中,情況會發生一些變化。首先是事務。在默認情況下,EDP中并沒有使用傳統的opensessioninview+aop transcation的方式,我們可以發現,在web.xml中,并沒有openSessionInViewFilter的配置,那ejs是怎么解決lazy load的問題的呢?另一個問題,在application.xml中或者任何的service.xml中,也都沒有看到有對servicetranscation的攔截,那ejs中又是怎么控制事務的呢?打開open-spring-transcation.xml文件,我們可以發現,ejs將一個tx:advice開在了DefaultRequestProceesorprocess的方法上。DefaultRequestProceesorprocess方法是包裹了整個action的執行、結果處理和錯誤處理(在jweb中,默認即是使用Velocity來處理視圖合成的)。這樣一來,ejs中的應用spring將在DefaultRequestProcessor的開始階段(Action開始之前)就打開一個統一的事務,在整個action處理完成之后,統一提交事務,也不會出現lazy load的問題。一個簡單的示意圖:

可以看到,事務的范圍并不是直接控制在action上的,而是橫跨了整個jweb的處理范圍。這樣處理的好處:

1,簡單:可以看到這種處理方式非常的簡單,在80%的時間內,不需要特別的為service開啟額外的事務控制,

2,統一:不需要額外的XML或者annotation,或者openSessionInView

只要在Action中的業務足夠短(避免事務的執行之間過長,造成大量的死鎖可能),這樣處理能很簡化的處理事務的問題。但這樣在并發量過大的情況下還是會有很多并發問題。要讓基于EDP的應用支持正常的錯誤處理和事務,這點使用標準的SSH方式即可。

現在就將EDP切換到標準SSH事務和Lazy Load處理,并且支持JWEB的錯誤處理方式。其實這個過程還是非常簡單的,在這個過程中,我還會討論一些其他問題。

 

1,去掉在DefaultRequestProcessor上面的事務配置,在EDPresources/application.xml中去掉:

    import resource="classpath:/com/easyjf/core/open-spring-transaction.xml"

2,在application-core-2.0.jar中的com.lanyotech.core/applicationBeans.xml中已經定義了對所有application-core-2.0serviceXML聲明式事務配置,抽取如下:

<tx:advice id="SystemRegionAdvice" transaction-manager="transactionManager">

  <tx:attributes>

   <tx:method name="add*" propagation="REQUIRES_NEW"/>

   <tx:method name="*" propagation="REQUIRED" read-only="true" />

  </tx:attributes>

</tx:advice>


<tx:advice id="txAdvice" transaction-manager="transactionManager">

  <tx:attributes>

   <tx:method name="*" propagation="REQUIRED" />

   <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>

  </tx:attributes>

</tx:advice>


<aop:config>

  <aop:pointcut id="SystemRegionMethods"              expression="execution(* com.lanyotech.core.service.ISystemRegionService.*(..))"/>

  <aop:pointcut id="applicationCoreServiceMethods"

expression="execution(* com.lanyotech.core.service.*.*(..))" />

  <aop:pointcut id="applicationSecurityServiceMethods"

expression="execution(* com.lanyotech.security.service.*.*(..))" />

  <aop:advisor advice-ref="SystemRegionAdvice" pointcut-ref="SystemRegionMethods"/>

  <aop:advisor advice-ref="txAdvice" pointcut-ref="applicationCoreServiceMethods" />

  <aop:advisor advice-ref="txAdvice" pointcut-ref="applicationSecurityServiceMethods" />

</aop:config>

3,在web.xml中添加OpenSessionInViewFilter

<filter>

       <filter-name>openSessionInView</filter-name>

       <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>

    </filter>


<filter-mapping>

       <filter-name>openSessionInView</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

4,到此,事務的配置已經切換完成。自己的項目中的service可以使用XML的,或者使用annotation的聲明式事務配置都可以。當然為了讓EDP中的示例和chat能正常運行,需要增加以下XML事務配置:

<aop:config>

       <aop:pointcut id="riaSampleService"      expression="execution(* com.lanyo.ria.samples.service..*.*(..))"/>

       <aop:pointcut id="riaService"

expression="execution(* com.lanyo.ria.service.*.*(..))" />

       <aop:advisor advice-ref="txAdvice" pointcut-ref="riaSampleService" />

       <aop:advisor advice-ref="txAdvice" pointcut-ref="riaService" />

    </aop:config>

 

<aop:config>

       <aop:pointcut id="chatService"

expression="execution(* com.lanyotech.chat.service.*.*(..))" />

       <aop:advisor advice-ref="txAdvice" pointcut-ref="chatService" />

    </aop:config>

 



3.62K
  曾道仁44期免费图片
<strike id="9fxl7"></strike>
<ruby id="9fxl7"><dl id="9fxl7"></dl></ruby>
<strike id="9fxl7"><dl id="9fxl7"></dl></strike>
<ruby id="9fxl7"><i id="9fxl7"><cite id="9fxl7"></cite></i></ruby>
<th id="9fxl7"></th>
<ruby id="9fxl7"><ins id="9fxl7"></ins></ruby>
<strike id="9fxl7"></strike>
<span id="9fxl7"><dl id="9fxl7"></dl></span>
<progress id="9fxl7"></progress><span id="9fxl7"></span>
<strike id="9fxl7"></strike>
<ruby id="9fxl7"><dl id="9fxl7"><del id="9fxl7"></del></dl></ruby>
<strike id="9fxl7"><i id="9fxl7"><del id="9fxl7"></del></i></strike><strike id="9fxl7"><dl id="9fxl7"><del id="9fxl7"></del></dl></strike>
<strike id="9fxl7"></strike>
<ruby id="9fxl7"><dl id="9fxl7"></dl></ruby>
<strike id="9fxl7"><dl id="9fxl7"></dl></strike>
<ruby id="9fxl7"><i id="9fxl7"><cite id="9fxl7"></cite></i></ruby>
<th id="9fxl7"></th>
<ruby id="9fxl7"><ins id="9fxl7"></ins></ruby>
<strike id="9fxl7"></strike>
<span id="9fxl7"><dl id="9fxl7"></dl></span>
<progress id="9fxl7"></progress><span id="9fxl7"></span>
<strike id="9fxl7"></strike>
<ruby id="9fxl7"><dl id="9fxl7"><del id="9fxl7"></del></dl></ruby>
<strike id="9fxl7"><i id="9fxl7"><del id="9fxl7"></del></i></strike><strike id="9fxl7"><dl id="9fxl7"><del id="9fxl7"></del></dl></strike>