java之Spring事務回滾和Ehcache配置
阿新 • • 發佈:2019-02-09
弄了一大早,終於配好了事務,事務的掃描包配好,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