當前位置:首頁 » 硬碟大全 » spring緩存註解
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

spring緩存註解

發布時間: 2022-02-06 21:13:45

① spring的cache怎麼設置大小,或者超時時間

從3.1開始,Spring引入了對Cache的支持。其使用方法和原理都類似於Spring對事務管理的支持。Spring Cache是作用在方法上的,其核心思想是這樣的:當我們在調用一個緩存方法時會把該方法參數和返回結果作為一個鍵值對存放在緩存中,等到下次利用同樣的參數來調用該方法時將不再執行該方法,而是直接從緩存中獲取結果進行返回。所以在使用Spring Cache的時候我們要保證我們緩存的方法對於相同的方法參數要有相同的返回結果。
使用Spring Cache需要我們做兩方面的事:
聲明某些方法使用緩存
配置Spring對Cache的支持
和Spring對事務管理的支持一樣,Spring對Cache的支持也有基於註解和基於XML配置兩種方式。下面我們先來看看基於註解的方式。

1 基於註解的支持
Spring為我們提供了幾個註解來支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable標記的方法在執行後Spring Cache將緩存其返回結果,而使用@CacheEvict標記的方法會在方法執行前或者執行後移除Spring Cache中的某些元素。下面我們將來詳細介紹一下Spring基於註解對Cache的支持所提供的幾個註解。
1.1 @Cacheable
@Cacheable可以標記在一個方法上,也可以標記在一個類上。當標記在一個方法上時表示該方法是支持緩存的,當標記在一個類上時則表示該類所有的方法都是支持緩存的。對於一個支持緩存的方法,Spring會在其被調用後將其返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法。Spring在緩存方法的返回值時是以鍵值對進行緩存的,值就是方法的返回結果,至於鍵的話,Spring又支持兩種策略,默認策略和自定義策略,這個稍後會進行說明。需要注意的是當一個支持緩存的方法在對象內部被調用時是不會觸發緩存功能的。@Cacheable可以指定三個屬性,value、key和condition。
1.1.1 value屬性指定Cache名稱
value屬性是必須指定的,其表示當前方法的返回值是會被緩存在哪個Cache上的,對應Cache的名稱。其可以是一個Cache也可以是多個Cache,當需要指定多個Cache時其是一個數組。
@Cacheable("cache1")//Cache是發生在cache1上的
public User find(Integer id) {
returnnull;
}

② hibernate二級緩存 和 spring整合的緩存(就是用哪個Cacheable註解的)有什麼區別么

二級緩存配置(spring+hibernate)

說明:本人不建議使用查詢緩存,因為查詢緩存要求完全相同的查詢sql語句才會起作用,所說的查詢緩存是針對第二次查詢時 sql語句與第一次sql語句完全相同 那麼就可以從緩存中取數據而不去資料庫中取數據了,在不啟用查詢緩存的情況下 每次的查詢數據也會緩存到二級緩存的 只不過每次查詢都會去查詢資料庫(不包括根據ID查詢),啟用查詢緩存很麻煩 需要每次查詢時 調用Query.setCacheable(true)方法才可以,如:List<OrgiData> orgiDatas = (List<OrgiData>) s.createQuery("from OrgiData").setCacheable(true).list();

因此建議將查詢緩存設置為如下:
hibernate.cache.use_query_cache=false

還有就是最重要的一點:對於經常修改或重要的數據不宜進行緩存,因為多並發時會造成數據不同步的情況。

首先增加ehcache-1.4.1.jar和backport-util-concurrent-3.1.jar或oscache-2.1.jar

一、spring配置

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>com/handpay/core/merchant/bean/MerchGroupBuy.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=false
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider </value>
</property>
</bean>

<!---紅色字體是二級緩存相關的設置->

二、hbm.xml文件示例

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.handpay.core.merchant.bean">
<class name="MerchGroupBuy" table="merch_group_buy">
<cache usage="read-write" region="com.handpay.core.merchant.bean.MerchGroupBuy"/>
<id name="id">
<generator class="native" />
</id>
<property name="code" />
<property name="createTime"/>
<property name="minNum"/>
<property name="status">
</property>
<property name="title"/>
<property name="typeCode"/>
<property name="updateTime"/>
</class>
</hibernate-mapping>

三、註解示例

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "alcor_t_countries", catalog = "alcorweb")
public class AlcorTCountries implements java.io.Serializable{。。。。}

四、配置文件參數詳解

ehcache.xml是ehcache的配置文件,並且存放在應用的classpath中。下面是對該XML文件中的一些元素及其屬性的相關說明:

<diskStore>元素:指定一個文件目錄,當EHCache把數據寫到硬碟上時,將把數據寫到這個文件目錄下。 下面的參數這樣解釋:

user.home – 用戶主目錄

user.dir – 用戶當前工作目錄

java.io.tmpdir – 默認臨時文件路徑

<defaultCache>元素:設定緩存的默認數據過期策略。

<cache>元素:設定具體的命名緩存的數據過期策略。

<cache>元素的屬性

name:緩存名稱。通常為緩存對象的類名(非嚴格標准)。

maxElementsInMemory:設置基於內存的緩存可存放對象的最大數目。

maxElementsOnDisk:設置基於硬碟的緩存可存放對象的最大數目。

eternal:如果為true,表示對象永遠不會過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認為false;

timeToIdleSeconds: 設定允許對象處於空閑狀態的最長時間,以秒為單位。當對象自從最近一次被訪問後,如果處於空閑狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過期。當對象過期,EHCache將把它從緩存中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地處於空閑狀態。

timeToLiveSeconds:設定對象允許存在於緩存中的最長時間,以秒為單位。當對象自從被存放到緩存中後,如果處於緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期。當對象過期,EHCache將把它從緩存中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義。

overflowToDisk:如果為true,表示當基於內存的緩存中的對象數目達到了maxElementsInMemory界限後,會把益出的對象寫到基於硬碟的緩存中。注意:如果緩存的對象要寫入到硬碟中的話,則該對象必須實現了Serializable介面才行。

memoryStoreEvictionPolicy:緩存對象清除策略。有三種:

1 FIFO ,first in first out ,這個是大家最熟的,先進先出,不多講了

2 LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的。如上面所講,緩存的元素有一個hit 屬性,hit 值最小的將會被清出緩存。

2 LRU ,Least Recently Used ,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。

五 、查看 二級緩存數據

1、使用sessionFactory直接獲取
Map cacheEntries = sessionFactory().getStatistics()
.getSecondLevelCacheStatistics("cacheRegionName")
.getEntries();

其中 cacheRegionName 既是 ehcache.xml配置中的<cache 標簽的name屬性值

2、讓log4j列印緩存信息(生成環境下請注釋掉,以免影響性能)
log4j.logger.org.hibernate.cache=debug

③ spring cache 註解 緩存名有什麼用

來看下@Cacheable 的說明


@Cacheable(value="accountCache"),這個注釋的意思是,當調用這個方法的時候,會從一個名叫 accountCache 的緩存中查詢,如果沒有,則執行實際的方法(即查詢資料庫),並將執行的結果存入緩存中,否則返回緩存中的對象。這里的緩存中的 key 就是參數 userName,value 就是 Account 對象。「accountCache」緩存是在 spring*.xml 中定義的名稱。

示例:


@Cacheable(value="accountCache")//使用了一個緩存名叫accountCache
publicAccountgetAccountByName(StringuserName){
//方法內部實現不考慮緩存邏輯,直接實現業務
System.out.println("realqueryaccount."+userName);
returngetFromDB(userName);
}


主要作用是給 cache 取個名稱

④ 怎麼列印spring緩存註解日誌

@Cacheable(value="cachedPointsTasks") 當查詢方法使用次註解時,如果已查詢過,則將數據緩存到緩存空間,不再查詢資料庫。

⑤ spring data redis不用註解能做緩存嗎

首先可以在多台伺服器裝memcached,啟動時分別指定容量和埠 訪問時採用集群方式訪問,只需要spring配置文件裡面配置即可 value可以放任何對象

⑥ spring註解怎麼實現的

【Spring如何使用註解機制完成自動裝配】
Java實例構造時會調用默認父類無參構造方法,Spring正是利用了這一點,讓"操作元素的代碼"得以執行。

【兩種處理策略】
(1)類級別的註解:如@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named註解,都是添加在類上面的類級別註解。
Spring容器根據註解的過濾規則掃描讀取註解Bean定義類,並將其注冊到Spring IoC容器中。

(2)類內部的註解:如@Autowire、@Value、@Resource以及EJB和WebService相關的註解等,都是添加在類內部的欄位或者方法上的類內部註解。
SpringIoC容器通過Bean後置註解處理器解析Bean內部的註解。

Spring實現@Autowire解析和注入的核心的類是通過來實現的。
我們可以通過其方法列表看出,其中對欄位的注入,對屬性的注入,還有選擇相應的構造方法來注入。
1,從構造方法的緩存中查詢其構造方法
2,若緩存中不存在,則根據反射獲取所有構造方法
3,遍歷所有構造方法,查詢器是否含有@Autowired屬性
4,判斷Autowired註解中指定了required屬性 (required屬性就是判斷是否強依依賴)若存在required就使用默認構造方法。
5,返回指定的構造方法

注入的時候則是通過inject方法來實現。

================================================================================================================================
Spring對註解的支持主要都是通過反射來獲取相應的註解,來做相應的處理,我們的工程中大部分都是使用@Service 和@Autowired來使用,其實我們還可以使用到其他的註解來加快我們的開發,滿足我們的多樣性需求。

annotation是挺簡單的東西.其實就是個聲明。然後通過反射去取那些聲明了值。
autowire其實也是這個意思。通過反射去看你autowire的方式,通過定義的方式,去給你聲明的變數賦值。

通過java的反射機制相關的API來訪問Annotation信息。
相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行為。
Java語言解釋器在工作時會忽略這些Annotation,因此在JVM中這些Annotation是「不起作用」的,只能通過配套的工具才能對這些Annotation類型的信息進行訪問和處理。
註解本身不做任何事情,只是像xml文件一樣起到配置作用。
註解代表的是某種業務意義,註解背後處理器的工作原理如上源碼實現:
——首先解析所有屬性,判斷屬性上是否存在指定註解。
——如果存在則根據搜索規則取得bean,然後利用反射原理注入。
——如果標注在欄位上面,也可以通過欄位的反射技術取得註解,根據搜索規則取得bean,然後利用反射技術注入。

================================================================================================================================
Spring 3.0 新增了另外兩個實現類: 和 。從名字便可以看出,它們是為註解而生,直接依賴於註解作為容器配置信息來源的 IoC 容器初始化類。由於 是 的 web 版本,其用法與後者相比幾乎沒有什麼差別,因此本文將以 為例進行講解。

我們需要在用於指定配置信息的類上加上 @Configuration 註解,以明確指出該類是 Bean 配置的信息源。並且 Spring 對標注 Configuration 的類有如下要求:
配置類不能是 final 的;
配置類不能是本地化的,亦即不能將配置類定義在其他類的方法內部;
配置類必須有一個無參構造函數。

將配置類中標注了 @Bean 的方法的返回值識別為 Spring Bean,並注冊到容器中,受 IoC 容器管理。@Bean 的作用等價於 XML 配置中的 <bean/> 標簽。

在一般的項目中,為了結構清晰,通常會根據軟體的模塊或者結構定義多個 XML 配置文件,然後再定義一個入口的配置文件,該文件使用 <import/> 將其他的配置文件組織起來。最後只需將該文件傳給 的構造函數即可。

針對基於註解的配置,Spring 也提供了類似的功能,只需定義一個入口配置類,並在該類上使用 @Import 註解引入其他的配置類即可,最後只需要將該入口類傳遞給 。
@Configuration
@Import({BookStoreServiceConfig.class,BookStoreDaoConfig.class})
public class BookStoreConfig{ … }

================================================================================================================================
http://zxf-noimp.iteye.com/blog/1071765

【定義註解】
// 在運行時執行
@Retention(RetentionPolicy.RUNTIME)
// 註解適用地方(欄位和方法)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface ZxfResource {

//註解的name屬性
public String name() default "";
}

【註解處理器】
public (String fileName) {
//讀取配置文件中管理的bean
this.readXML(fileName);
//實例化bean
this.instancesBean();
//註解處理器
this.annotationInject();
}

⑦ springmvc註解緩存對象會重復緩存嗎

輔堂有何區別

⑧ 關於spring boot 緩存application.yml文件的配置

這些方式優先順序如下:命令行參數來自java:comp/env的JNDI屬性Java系統屬性(System.getProperties())操作系統環境變數RandomValuePropertySource配置的random.*屬性值jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件jar包外部的application.properties或application.yml(不帶spring.profile)配置文件jar包內部的application.properties或application.yml(不帶spring.profile)配置文件@Configuration註解類上的@PropertySource

⑨ spring在service層吧方法加上@cacheable註解,為什麼還是每次跑資料庫

沒生效吧。啟用緩存註解功能的配置加了嗎,而且一定要聲明在spring的主配置文件里,否則不會生效
<cache:annotation-driven cache-manager="cacheManager" />
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:cache/ehcache.xml"/>
</bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="cacheManagerFactory"/>
</bean>

⑩ Spring緩存,@Cacheable註解的value屬性緩存名稱是個什麼東西

在ehcache.xml裡面配置的cache標簽的name就是這個value值