Ehcache二级缓存

  1. 为什么需要缓存
    提高程序的性能

  2. 什么样的数据需要缓存
    很少被修改或根本不改的数据 数据字典

3.ehcache的特点
1 够快
Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试, Ehcache终被设计于large, high concurrency systems.

2 够简单
开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目
3 够袖珍
关于这点的特性,官方给了一个很可爱的名字small foot print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。
4 够轻量
核心程序仅仅依赖slf4j这一个包,没有之一!
5 好扩展
Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多
6 监听器
缓存管理器监听器 (CacheManagerListener)和 缓存监听器(CacheEvenListener),做一些统计或数据一致性广播挺好用的
7 分布式缓存
从Ehcache 1.2开始,支持高性能的分布式缓存,兼具灵活性和扩展性

在Hibernate的hibernate.cfg.xml配置中添加二级缓存
 <!-- 开启二级缓存 -->
      <property name="hibernate.cache.use_second_level_cache">true</property>
      <!-- 开启查询缓存 -->
      <property name="hibernate.cache.use_query_cache">true</property>
      <!-- EhCache驱动 -->
      <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
缓存的原理
		1.第一次为空他会去数据库查询数据库
		2.第二次他会去缓存里拿
		代码测试
		public class EhacheTest {
	
	static Map<String, Object> map = new HashMap<>();
	
	public static Object getValue(String key) {
		Object value = map.get(key);
		if(value == null) {
			System.out.println("查数据库");
			map.put(key, "权限数据");
			value = map.get(key);
		}
		return value;
	}
	
	/**
	*列如:
	 * 	张三,李四都属于学生角色
	 * 	
	 * 		1.张三进来查询数据库拿到对应的数据
	 * 		2.李四进来,既然看到的东西是一样的,查询数据库耗性能。能拿到跟张三一样的数
	 * 	据并且不访问数据库
	 * 			办法,张三访问数据库的时候,将信息保存到内存中。 
	 *          
	 * 			考虑:1.什么样的数据需要缓存
	 *	  数据很少被改变或者不被修改的数据。
	  *    2.清理内存
	  *	   ehcache可以帮我们清理内存
	  *	 <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false"           								
      *			diskPersistent="false"   timeToIdleSeconds="0" timeToLiveSeconds="600" 		
	  *    memoryStoreEvictionPolicy="LRU"/>
	  * 
	  * 	<!--name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)->
	  * <cache name="stuCache" eternal="false" maxElementsInMemory="100"
	  *  overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
	  * timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU"/>
	  * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(getValue("menus"));
		System.out.println(getValue("menus"));
	}
	
}
	
Hibernate不支持查询多个:
			如果必须要用的话就把代码拆开
			在实体类加个字段 isUserCache(自己定义) boolean类型用于判断
			代码演示
	public static void main(String[] args) {
		Session session = SessionFactoryUtils.getSessionFactory();
		Transaction transaction = session.beginTransaction();
		
		Query query = session.createQuery("from User");
		User user = new User();
		user.setUserCache(true);
		
		/**
		 * 使用到方法的时候,使用ehcache,默认是不使用缓存
		 */
		if(user.isUserCache()) {
			query.setCacheable(true);
		}
		List list = query.list();
		System.out.println(list.size());
		
		List list1 = query.list();
		System.out.println(list1.size());
		
		List list2 = query.list();
		System.out.println(list2.size());
		
		List list3 = query.list();
		System.out.println(list3.size());
		
		
		transaction.commit();
		session.close();
		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值