首先我们要明白什么是缓存,缓存是指临时文件交换区。临时就说明了他不是永久性的。缓存是介于cpu和主存之间的设备。他的读写速度比主存快,比cpu慢。缓存有一个叫命中率的概念。这个也很好理解。Cpu是处理数据和运算数据的地方,数据的读取要不来自内存,要不来自缓存。但是缓存介于主存和内存之间。所以如果cpu能直接从缓存中拿数据。那么他执行的效率一定会提高。如果缓存中没有再去主存中那数据。那么你也就可以知道,命中率=缓存访问的次数/(缓存访问的次数+主存的访问次数)。
所以hibernate引入缓存。你就知道为什么了。就是为了提高效率的。要知道每次对数据的访问都是很消耗资源的,而且数据库是外部的,所以时间执行会慢。试想有些数据你要从数据库里面查询(这个结果很大),查询第一遍。接着又要查询第二遍。如果没有缓存这就意味着你要访问两次数据库。但是查询的结果只有一两条更新,或者压根没有更新。所以如果这时候如果有缓存的话,你可以将第一次结果放在缓存中。那么第二次查询你可以从缓存中取数据,如果没有再去访问数据库,这就大大提高了效率。所以使用缓存这里有四个前提,第一:对数据的精确性不是很高,也就是说你允许有数据误差。第二:修改次数小于读写的次数(缓存命中率要高),试想如果你第一次和第二次的查询,结果根本就不一样,
首先去缓存找没找到,然后去数据库中找。这样还不如不要缓存直接上数据库找。第三:数据要有独享控制,如果你这边在读写那边这修改这样的数据基本就是废的。第四:数据的容量小于内存容量,这是硬伤,否则会内存溢出、
那么hibernate的缓存个人认为是变相的map,事实上他也是个map。首先如何实现缓存,用户第一次查询数据,在换回结果的同时也把结果放到map里面一份。要知道map是一个键值对的集合,这里的key就是你的hql语句,value就是你的封装有用的信息。那么第二次查询hql语句相同的情况下,hibernate就会自己先去map里面找,如果没有就去数据库里面找。而且本人对集合的理解就是集合是可以执行增删改查的容器。所以我们对map的移除的过程就是在清理缓存的过程。当然hibernate的缓存远没有一个map这么简单,比如说缓存的有效时间之类的事情要解决。
在hibernate中缓存缓存分为一级缓存和二级缓存。一级缓存是session级的共享,主要这些可以操作有save,update,saveOrUpdate,load,get,list,iterate,lock,evick,clear,contains,flush。但是一级缓存作用范围小,所以hibernate有2级缓存。一般hibernate现在1级缓存中找如果找不到就去2级缓存中找。二级缓存,sessionFactory级的共享,首先hibernate在配置文件中要启用2级缓存的配置。
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- 设置二级缓存插件EHCache的Provider类-->
<propertyname="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!-- 启动"查询缓存" -->
<propertyname="hibernate.cache.use_query_cache">
true
</property>
</session-factory>
</hibernate-configuration>
ehcache.xml
<ehcache>
<!-- maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过期,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数 -->
<diskStorepath="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000"eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"overflowToDisk="true"/>
</ehcache>
****.hbm.xml
<?xmlversion="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mappingPUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class>
<!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-writetransactional-->
<cacheusage="read-write"/>
</class>
</hibernate-mapping>
还有客户实现web上数据的访问的时候有服务器有两种缓存方式,一种是分布缓存和中央缓存的方式。分布式获取数据快但是修改数据的时候成本高,另一种相反,所以视情况而定。