-
为什么需要缓存
提高程序的性能 -
什么样的数据需要缓存
很少被修改或根本不改的数据 数据字典
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();
}