1. 为什么需要缓存
拉高程序的性能
关系型数据库:数据与数据之间存在关系(联系)的数据库 mysql/Oracle、sqlserver
非关系型数据库:数据与数据之间是不存在关系的,key-value
1、基于文件存储的数据库:ehcache
2、基于内存存储的数据库:redis、memcache
3、基于文档存储的数据库:mongodb
2. ehcache的使用
2.1 导入相关依赖
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.0</version>
</dependency>
2.2 核心接口
CacheManager:缓存管理器
Cache:缓存对象,缓存管理器内可以放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口
Element:单条缓存数据的组成单位
2.3 src:ehcache.xml(以及当中的一些元素)
①: eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
②:timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问
③:timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问
注意:①zai pro.xml导入ehcache依赖包的桥接包的版本要与 hibernate的依赖包的版本一致
②hibernate整合ehcache默认存缓单条记录,不能查询多条记录
demo:
package com.zking.nine.util;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import java.io.InputStream;
public class EhcacheUtil {
private static CacheManager cacheManager;
static {
try {
//建模
InputStream is = EhcacheUtil.class.getResourceAsStream("/ehcache.xml");
cacheManager = CacheManager.create(is);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private EhcacheUtil() {
}
public static void put(String cacheName, Object key, Object value) {
Cache cache = cacheManager.getCache(cacheName);
if (null == cache) {
//以默认配置添加一个名叫cacheName的Cache
cacheManager.addCache(cacheName);
cache = cacheManager.getCache(cacheName);
}
cache.put(new Element(key, value));
}
public static Object get(String cacheName, Object key) {
Cache cache = cacheManager.getCache(cacheName);
Element element = cache.get(key);
return null == element ? null : element.getValue();
}
/**
* 手动移除缓存中的操作数据
* @param cacheName
* @param key
*/
public static void remove(String cacheName, Object key) {
Cache cache = cacheManager.getCache(cacheName);
cache.remove(key);
}
}
package com.zking.nine.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.zking.one.entity.User;
import com.zking.two.util.SessionFactoryUtil;
public class EhcacheTest3 {
/**
* hibernate整合ehcache完成查询单个用户
* @param args
*/
public static void main(String[] args) {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
//打印出来只需要查一次
User user = session.get(User.class, 5);
System.out.println(user);
User user2 = session.get(User.class, 5);
System.out.println(user2);
User user3 = session.get(User.class, 5);
System.out.println(user3);
transaction.commit();
session.close();
}
}
package com.zking.nine.test;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import com.zking.one.entity.User;
import com.zking.two.util.SessionFactoryUtil;
public class EhcacheTest4 {
/**
* hibernate整合ehcache完成查询多个用户
* hibernate整合ehcache默认缓存单条记录,不能缓存多条记录
* @param args
*/
public static void main(String[] args) {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from User");
//查询带参数
User user=new User();
//需要缓存
user.setUserCache(true);
/*
* 使用dao方法的时候,使用ehcache存缓,默认查多条记录是不使用存缓
*/
if(user.isUserCache()) {
query.setCacheable(true);
}
List list = query.list();
System.out.println(list.size());
List list2 = query.list();
query.setCacheable(false);
System.out.println(list2.size());
List list3 = query.list();
query.setCacheable(true);
System.out.println(list3.size());
transaction.commit();
session.close();
}
}