1、缓存介绍
当处理器读取数据时,首先会从缓存中查找,如果缓存有数据,那么处理器直接使用,如果缓存中中没有,则从读取速度相对慢的内存中读取,同时把这个数据块调入缓存中,以便再次使用,这样可以大大节省读取内存的时间。
在JAVA-EE中缓存对于数据量大,高并发显得特别重要
- 用户–后台 采用OSCache缓存
- 持久层一级缓存
- 持久层二级缓存
- 分布式缓存
1、一级缓存
当Hibernate根据ID访问数据对象的时候,首先会从Session一级缓存中查找,如果查不到并且配置了二级缓存,那么会从二级缓存中查找,如果还查不到,就会查询数据库,把结果按照ID放入到缓存中。
一级缓存作用于Dao层(数据库)
1、在Hiberante中也就是Session级别缓存,与Session绑定,生命周期与Session也相同。
Session session=factory.openSession();
Transaction ts = null;
try {
ts=session.beginTransaction(); //开始一个事务
................... //执行事务
ts.commit(); //提交事务
} catch (HibernateException e) { //如果出现异常就撤销事务
if(ts!=null){
ts.rollback(); //回滚事务
}
e.printStackTrace();
} finally{
session.close();//不管事务执行成功与否,最后都关闭Session并且放在finally中以提高安全性
}
优点:缓存在内存中,读取速度较快
缓存具体到某个事务,范围比较小
缺点:内存容量有限,通过合理的方式检索或者限制查询大小。
2、二级缓存
二级缓存是在SessionFactory中(也就是在数据库连接池中所有dao共享)
缓存介质:内存和硬盘,如果内存缓存达到上限时,可指定硬盘缓存,在Hibernate中就是CacheProvider(缓存适配器)
二级缓存适用场景:
- 很少被修改的数据
- 对并发要求不高
- 不重要的数据
public void run() {
SessionFactory sf = CacheMain.getSessionFactory();
Session session = sf.getCurrentSession();
session.beginTransaction();
User user = (User)session.get( User.class, "1" );
System.out.println( user );
session.getTransaction().commit();
}
public static void main(String[] args) {
CacheMain main1 = new CacheMain();
main1.start();
CacheMain main2 = new CacheMain();
main2.start();
}
}
3、分布式缓存
分页式缓存CARP(Caching Array Routing Protocol)技术,可以产生一种高效无接缝式的缓存,使得让多台缓存服务器形同一台,并且不会造成数据重复存放的情况。
同时还有层次缓存,动态缓存和计划缓存三种。
5、OSCache
OSCache是一种页面缓存技术
缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。
缓存介质:内存和硬盘。
OSCache缓存域分application和session两种
application(对性能优化作用很明显)和某个 用户某次操作某个网站session(用户和web服务器会话)级共享两种。对共享的资源设置过期时间。即当服务器运行时发现在
作用域内还有对象,就以类似静态页面的形式(因为缓存了要显示的信息)提供给客户端,当过期了,就需要重查资源(如果是页面里的缓存就需要资源能在jsp 里提供)。如果没有过期,但内容改变了,可以通过flush的方式清除老资源以便加载新的资源。