1. 程式人生 > >hibernate 使用 memcached 開啟二級快取

hibernate 使用 memcached 開啟二級快取

現在的專案配置的是memcached二級快取,使用的是hibernate4.18版本

1.匯入所需的jar包

commons-codec-1.10.jar

hibernate3-memcached-1.5.jar(hibernate3使用此包)

hibernate4-memcached-1.0.jar(hibernate4使用此包)

memcached-2.5.jar

slf4j-api-1.6.1.jar

spy-2.4.jar

2.修改applicationContext的hibernate配置

<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">#{jdbc['hibernate.dialect']}</prop>
				<prop key="hibernate.hbm2ddl.auto">#{jdbc['hibernate.hbm2ddl.auto']}</prop>
				<prop key="hibernate.show_sql">#{jdbc['hibernate.show_sql']}</prop>
				<prop key="hibernate.format_sql">#{jdbc['hibernate.format_sql']}</prop>
				<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>  
				<!-- 快取配置 -->
				<prop key="hibernate.cache.use_query_cache">true</prop><!-- 開啟快取 -->
				<prop key="hibernate.cache.use_second_level_cache">true</prop><!-- 開啟二級快取 -->
				<!-- hibernate3 二級快取提供類
				<prop key="hibernate.cache.provider_class">
				  com.googlecode.hibernate.memcached.MemcachedCacheProvider
				</prop>
				-->
				<!-- hibernate4 二級快取提供類-->
				<prop key="hibernate.cache.region.factory_class">
				  com.googlecode.hibernate.memcached.MemcachedRegionFactory
				</prop>
				<prop key="hibernate.cache.use_structured_entries">true</prop><!-- 結構化儲存 -->
				<prop key="hibernate.max_fetch_depth">3</prop>
				<prop key="hibernate.memcached.servers">192.168.39.39:11211</prop><!-- 二級快取伺服器位置和埠 -->
				<!-- 二級快取字首名稱-->
				<prop key="hibernate.cache.region_prefix">quality.cache.memcached</prop>
				<prop key="hibernate.memcached.operationTimeout">5000</prop><!-- 操作超時時間,單位ms -->
				<prop key="hibernate.memcached.cacheTimeSeconds">200</prop><!-- 快取失效時間,單位秒 -->
			</props>
		</property>

3.測試快取效果

    hibernate使用快取需2步

    在實體類開啟快取,可以使用註解或hbm配置。因為專案中用的是註解,這裡的是註解

@Entity
@cache(usage=CacheConcurrencyStrategy.READ_WRITE)
@Table(name="t_user")
public class User {
	@Id
	@Column(name="ID",length=32)
	@GeneratedValue(generator="uuid")
	@GenericGenerator(name="uuid",strategy="uuid")
	private String id;
................

    執行查詢方法時開啟快取

@Override
	public <T> List<T> findEntities(Class<T> c) {
		String hql = "from "+c.getSimpleName();
		Query query = getSession().createQuery(hql);
		query.setCacheable(true);
		return query.list();
	}

這樣就可以使用memcached二級快取了,可以看到console只打印出一句查詢sql。

注意:

hibernate.memcached.servers 可以配置多個server:用空格隔開,這多個server是類似叢集的關係,但server本生的配置可以完全獨立