1. 程式人生 > >java之Spring事務回滾和Ehcache配置

java之Spring事務回滾和Ehcache配置

弄了一大早,終於配好了事務,事務的掃描包配好,Ehcache就是切面的問題,一切問題也迎刃而解。。。

一、Spring事務回滾

1、applicationContext.xml中配置

<!--spring 掃包 @Service ..... -->
    <context:component-scan base-package="com.yanhui">
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"
/>
</context:component-scan>

2、spring-mvc.xml配置

<!-- 掃描器-->
    <!-- <context:component-scan base-package="com.yanhui.*" /> -->
    <context:component-scan base-package="com.yanhui" use-default-filters="false">
        <context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

3、applicationContext.xml開啟事務

<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<property name="dataSource" ref="dataSource" /> </bean> <!-- <tx:annotation-driven transaction-manager="transactionManager"/> --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="publish*" /> <tx:method name="save*" /> <tx:method name="add*" /> <tx:method name="update*" /> <tx:method name="insert*" /> <tx:method name="create*" /> <tx:method name="del*" /> <tx:method name="load*" /> <tx:method name="init*" /> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- AOP配置 --> <aop:config> <aop:pointcut id="myPointcut" expression="execution(public * com.yanhui.service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" /> </aop:config>

4、測試

mapper.insert(record);
int a = 1/0;

二、Ehcache配置

1、引入jar包

<dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.6.11</version>
    </dependency>

2、新建一個cache-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/cache
        http://www.springframework.org/schema/cache/spring-cache.xsd ">

    <cache:annotation-driven cache-manager="cacheManager"/>

    <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml"/>
    </bean>

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcacheManager"/>
        <property name="transactionAware" value="true"/>
    </bean>
</beans>

3、新建一個ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">

    <diskStore path="java.io.tmpdir"/>

    <defaultCache eternal="false"
                  maxEntriesLocalHeap="1000"
                  overflowToDisk="false"
                  diskPersistent="false"
                  timeToIdleSeconds="3600"
                  timeToLiveSeconds="3600"/>

    <cache name="baseCache"
           eternal="false"
           maxEntriesLocalHeap="200"
           overflowToDisk="false"
           diskPersistent="false"
           timeToIdleSeconds="600"
           statistics="true"
           timeToLiveSeconds="600"/>

    <!--
        eternal="false"   // 元素是否永恆,如果是就永不過期(必須設定)
        maxElementsInMemory="1000" // 快取容量的記憶體最大值(必須設定)
        overflowToDisk="false"  // 當快取達到maxElementsInMemory值是,是否允許溢位到磁碟(必須設定)
        diskPersistent="false"  // 磁碟快取在VM重新啟動時是否保持(預設為false)
        timeToIdleSeconds="0" // 導致元素過期的訪問間隔(秒為單位). 0表示可以永遠空閒,預設為0
        timeToLiveSeconds="600" // 元素在快取裡存在的時間(秒為單位). 0 表示永遠存在不過期
        memoryStoreEvictionPolicy="LFU" // 當達到maxElementsInMemory時,如何強制進行驅逐預設使用"最近使用(LRU)"策略,其它還有先入先出FIFO,最少使用LFU,較少使用LRU
    -->
</ehcache>

4、applicationContext.xml中加入

 <import resource="cache-config.xml"/>

5、service.impl方法中

@Cacheable(value = "baseCache")
    public User findById(int id) {
        return userMapper.selectByPrimaryKey(id);
    }

6、測試
這裡寫圖片描述

三、遇到的坑

spring、springMVC重複掃描導致事務失效的問題

意思是applicationContext.xml中掃描包和spring-mvc中的掃描包重複了,前者作為父容器先啟動並配置了事務,然後spring-mvc.xml再啟動,作為子容器也來管理包的內容,但是會覆蓋前面applicationContext.xml對包的處理,而新的管理中並沒有配置事務,所以事務就失敗了。

經結論得出:
由於伺服器啟動時的載入配置檔案的順序為web.xml—root-context.xml(Spring的配置檔案)—servlet-context.xml(SpringMVC的配置檔案)。

解決辦法:
Spring容器中不掃描Controller上的註解(即SpringMVC註解),SpringMVC層只負責掃描@Controller