spring事務緩存
Ⅰ spring mvc 怎麼設計緩存
用於提供如瀏覽器緩存控制、是否必須有session開啟、支持的請求方法類型(GET、POST等)等,該類主要有如下屬性:
Set<String> supportedMethods:設置支持的請求方法類型,默認支持「GET」、「POST」、「HEAD」,如果我們想支持「PUT」,則可以加入該集合「PUT」。
boolean requireSession = false:是否當前請求必須有session,如果此屬性為true,但當前請求沒有打開session將拋出HttpSessionRequiredException異常;
boolean useExpiresHeader = true:是否使用HTTP1.0協議過期響應頭:如果true則會在響應頭添加:「Expires:」;需要配合cacheSeconds使用;
boolean useCacheControlHeader = true:是否使用HTTP1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用;
boolean useCacheControlNoStore = true:是否使用HTTP 1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用;
private int cacheSeconds = -1:緩存過期時間,正數表示需要緩存,負數表示不做任何事情(也就是說保留上次的緩存設置),
1、cacheSeconds =0時,則將設置如下響應頭數據:
Pragma:no-cache // HTTP 1.0的不緩存響應頭
Expires:1L // useExpiresHeader=true時,HTTP 1.0
Cache-Control :no-cache // useCacheControlHeader=true時,HTTP 1.1
Cache-Control :no-store // useCacheControlNoStore=true時,該設置是防止Firefox緩存
2、cacheSeconds>0時,則將設置如下響應頭數據:
Expires:System.currentTimeMillis() + cacheSeconds * 1000L // useExpiresHeader=true時,HTTP 1.0
Cache-Control :max-age=cacheSeconds // useCacheControlHeader=true時,HTTP 1.1
3、cacheSeconds<0時,則什麼都不設置,即保留上次的緩存設置。
此處簡單說一下以上響應頭的作用,緩存控制已超出本書內容:
HTTP1.0緩存控制響應頭
Pragma:no-cache:表示防止客戶端緩存,需要強制從伺服器獲取最新的數據;
Expires:HTTP1.0響應頭,本地副本緩存過期時間,如果客戶端發現緩存文件沒有過期則不發送請求,HTTP的日期時間必須是格林威治時間(GMT),如「Expires:Wed, 14 Mar 2012 09:38:32 GMT」;
HTTP1.1緩存控制響應頭
Cache-Control :no-cache 強制客戶端每次請求獲取伺服器的最新版本,不經過本地緩存的副本驗證;
Cache-Control :no-store 強制客戶端不保存請求的副本,該設置是防止Firefox緩存
Cache-Control:max-age=[秒] 客戶端副本緩存的最長時間,類似於HTTP1.0的Expires,只是此處是基於請求的相對時間間隔來計算,而非絕對時間。
還有相關緩存控制機制如Last-Modified(最後修改時間驗證,客戶端的上一次請求時間 在 伺服器的最後修改時間 之後,說明伺服器數據沒有發生變化 返回304狀態碼)、ETag(沒有變化時不重新下載數據,返回304)。
該抽象類默認被AbstractController和WebContentInterceptor繼承。
Ⅱ spring boot@cacheable的緩存怎麼使用
從3.1開始,Spring引入了對Cache的支持。其使用方法和原理都類似於Spring對事務管理的支持。Spring Cache是作用在方法上的,其核心思想是這樣的:當我們在調用一個緩存方法時會把該方法參數和返回結果作為一個鍵值對存放在緩存中
Ⅲ 如何在spring中使用緩存
在Spring緩存機制中,包括了兩個方面的緩存操作:1.緩存某個方法返回的結果;2.在某個方法執行前或後清空緩存。
Spring僅僅是提供了對緩存的支持,但它並沒有任何的緩存功能的實現,spring使用的是第三方的緩存框架來實現緩存的功能。其中,spring對EHCache提供了很好的支持。
參考博客:http://www.cnblogs.com/fysola/p/6378400.html
Ⅳ spring自帶緩存機制怎麼弄
此緩存方法既適用於層,也適用於service層。
spring配置文件配置:<!--緩存配置-->
<!--啟用緩存註解功能-->
<cache:annotation-drivencache-manager="cacheManager"/>
<!--spring自己的基於java.util.concurrent.ConcurrentHashMap實現的緩存管理器(該功能是從Spring3.1開始提供)-->
<beanid="cacheManager"class="org.springframework.cache.support.SimpleCacheManager">
<propertyname="caches">
<set>
<!--此處類concurrentMapCacheFactoryBean的作用是
-->
<beanname="myCache"class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/>
</set>
</property>
</bean>service層示例如下:@Transactional(readOnly=true)
@Cacheable(value="myCache")
publicJsonObjectgetWFK(JsonObjectparams){
OneObob=newOneOb();
try{
List<Map<String,Object>>map=LawAssistantMapper.getWFK();
ob.setOb(map);
}catch(Exceptione){
e.printStackTrace();
ob.setCode(500);
ob.setMsg("伺服器錯誤!!!");
returnnewJsonObject(Json.encode(ob));
}
ob.setCode(200);
ob.setMsg("ok");
logger.debug(Json.encode(ob));
returnnewJsonObject(Json.encode(ob));
}
由於使用的是spring自帶的緩存類,所以,僅僅需要兩步:1.在spring配置文件中聲明,2.在service層,方法代碼前增加註解,即可。
缺點:
spring自帶的緩存功能,實質上是通過java類來保存緩存的數據,這樣會佔用一定的內存消耗,並發率越高,對內存的壓力越大。
碼民直接使用的緩存類:org.springframework.cache.support.SimpleCacheManager,org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean
Ⅳ 如何理解Spring對緩存的支持
在Spring緩存機制中,包括了兩個方面的緩存操作:1.緩存某個方法返回的結果;2.在某個方法執行前或後清空緩存。
Ⅵ springboot為什麼查詢會先查詢緩存
從3.1開始,Spring引入了對Cache的支持。其使用方法和原理都類似於Spring對事務管理的支持。SpringCache是作用在方法上的,其核心思想是這樣的:當我們在調用一個緩存方法時會把該方法參數和返回結果作為一個鍵值對存放在緩存中
Ⅶ springboot緩存怎麼來操作
1.在pom.xml中引入cache依賴,添加如下內容:
復制代碼
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
復制代碼
2.在Spring Boot主類中增加@EnableCaching註解開啟緩存功能,如下:
復制代碼
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
復制代碼
3.在數據訪問介面中,增加緩存配置註解,如:
復制代碼
@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {
@Cacheable
User findByName(String name);
}
復制代碼
SpringBoot支持很多種緩存方式:redis、guava、ehcahe、jcache等等。
Ⅷ spring上的緩存與頁面緩存有什麼作用
@Cacheable(value="accountCache"),這個注釋的意思是,當調用這個方法的時候,會從一個名叫 accountCache 的緩存中查詢,如果沒有,則執行實際的方法(即查詢資料庫),並將執行的結果存入緩存中,否則返回緩存中的對象。這里的緩存中的 key 就是參數 userName,value 就是 Account 對象。「accountCache」緩存是在 spring*.xml 中定義的名稱。
示例:
@Cacheable(value="accountCache")// 使用了一個緩存名叫 accountCache
public Account getAccountByName(String userName) {
// 方法內部實現不考慮緩存邏輯,直接實現業務
System.out.println("real query account."+userName);
return getFromDB(userName);
回答不容易,希望能幫到您,滿意請幫忙採納一下,謝謝 !
Ⅸ spring一級緩存和二級緩存的區別是什麼
一級緩存:
就是Session級別的緩存。一個Session做了一個查詢操作,它會把這個操作的結果放在一級緩存中。
如果短時間內這個session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級緩存中拿,而不會再去連資料庫,取數據。
它是內置的事務范圍的緩存,不能被卸載。
二級緩存:
就是SessionFactory級別的緩存。顧名思義,就是查詢的時候會把查詢結果緩存到二級緩存中。
如果同一個sessionFactory創建的某個session執行了相同的操作,hibernate就會從二級緩存中拿結果,而不會再去連接資料庫。
這是可選的插件式的緩存,在默認情況下,SessionFactory不會啟用這個插件。
可以在每個類或每個集合的粒度上配置。緩存適配器用於把具體的緩存實現軟體與Hibernate集成。
嚴格意義上說,SessionFactory緩存分為兩類:內置緩存和外置緩存。我們通常意義上說的二級緩存是指外置緩存。
內置緩存與session級別緩存實現方式相似。前者是SessionFactory對象的一些集合屬性包含的數據,後者是指Session的一些集合屬性包含的數據
SessionFactory的內置緩存中存放了映射元數據和預定義SQL語句。
映射元數據是映射文件中數據的拷貝;
而預定義SQL語句是在Hibernate初始化階段根據映射元數據推導出來。
SessionFactory的內置緩存是只讀的,應用程序不能修改緩存中的映射元數據和預定義SQL語句,因此SessionFactory不需要進行內置緩存與映射文件的同步。
Hibernate的這兩級緩存都位於持久化層,存放的都是資料庫數據的拷貝。
緩存的兩個特性:
緩存的范圍
緩存的並發訪問策略
1、緩存的范圍
決定了緩存的生命周期以及可以被誰訪問。緩存的范圍分為三類。
事務范圍
進程范圍
集群范圍
註:
對大多數應用來說,應該慎重地考慮是否需要使用集群范圍的緩存,因為訪問的速度不一定會比直接訪問資料庫數據的速度快多少。
事務范圍的緩存是持久化層的第一級緩存,通常它是必需的;進程范圍或集群范圍的緩存是持久化層的第二級緩存,通常是可選的。
2、緩存的並發訪問策略
當多個並發的事務同時訪問持久化層的緩存的相同數據時,會引起並發問題,必須採用必要的事務隔離措施。
在進程范圍或集群范圍的緩存,即第二級緩存,會出現並發問題。
因此可以設定以下四種類型的並發訪問策略,每一種策略對應一種事務隔離級別。
事務型並發訪問策略是事務隔離級別最高,只讀型的隔離級別最低。事務隔離級別越高,並發性能就越低。
A 事務型:僅僅在受管理環境中適用。它提供了Repeatable Read事務隔離級別。
對於經常被讀但很少修改的數據,可以採用這種隔離類型,因為它可以防止臟讀和不可重復讀這類的並發問題。
B 讀寫型:提供了Read Committed事務隔離級別。僅僅在非集群的環境中適用。
對於經常被讀但很少修改的數據,可以採用這種隔離類型,因為它可以防止臟讀這類的並發問題。
C 非嚴格讀寫型:不保證緩存與資料庫中數據的一致性。
如果存在兩個事務同時訪問緩存中相同數據的可能,必須為該數據配置一個很短的數據過期時間,從而盡量避免臟讀。
對於極少被修改,並且允許偶爾臟讀的數據,可以採用這種並發訪問策略。
D 只讀型:對於從來不會修改的數據,如參考數據,可以使用這種並發訪問策略。
什麼樣的數據適合存放到第二級緩存中?
1、很少被修改的數據
2、不是很重要的數據,允許出現偶爾並發的數據
3、不會被並發訪問的數據
4、參考數據
不適合存放到第二級緩存的數據?
1、經常被修改的數據
2、財務數據,絕對不允許出現並發
3、與其他應用共享的數據。
Hibernate的二級緩存策略的一般過程如下:
1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的數據對象。
2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢資料庫,把結果按照ID放入到緩存。
4) 刪除、更新、增加數據的時候,同時更新緩存。
註:
Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query緩存。
Query緩存策略的過程如下:
1) Hibernate首先根據這些信息組成一個Query Key,Query Key包括條件查詢的請求一般信息:SQL, SQL需要的參數,記錄范圍(起始位置rowStart,最大記錄個數maxRows),等。
2) Hibernate根據這個Query Key到Query緩存中查找對應的結果列表。如果存在,那麼返回這個結果列表;如果不存在,查詢資料庫,獲取結果列表,把整個結果列表根據Query Key放入到Query緩存中。
3) Query Key中的SQL涉及到一些表名,如果這些表的任何數據發生修改、刪除、增加等操作,這些相關的Query Key都要從緩存中清空。
Ⅹ Spring是如何緩存單例bean
DefaultSingletonBeanRegistry的singletonObjects是一個ConcurrentHashMap
對象,單例bean就緩存到這里。