缓存分为三种:一级缓存、二级缓存、查询缓存(三级缓存)
1、一级缓存
Session级缓存,只能在Session内部使用。

2、二级缓存
sessionFactory级别,所有Session可以共用。以配置EHCache为例:
a)新建/src/ehcache.xml文件,内容如下:
<ehcache>

    
<!-- Sets the path to the directory where cache .data files are created.

         If the path is a Java System Property it is replaced by
         its value in the running VM.

         The following properties are translated:
         user.home - User's home directory
         user.dir - User's current working directory
         java.io.tmpdir - Default temp file path 
-->
    
<diskStore path="java.io.tmpdir"/>


    
<!--Default Cache configuration. These will applied to caches programmatically created through
        the CacheManager.

        The following attributes are required for defaultCache:

        maxInMemory       - Sets the maximum number of objects that will be created in memory
        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
                            is never expired.
        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
                            if the element is not eternal. Idle time is now - last accessed time
        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
                            if the element is not eternal. TTL is now - creation time
        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
                            has reached the maxInMemory limit.

        
-->
    
<defaultCache
        
maxElementsInMemory="10000"
        eternal
="false"
        timeToIdleSeconds
="120"
        timeToLiveSeconds
="1200"
        overflowToDisk
="true"
        
/>

    
<!--Predefined caches.  Add your cache configuration settings here.
        If you do not have a configuration for your cache a WARNING will be issued when the
        CacheManager starts

        The following attributes are required for defaultCache:

        name              - Sets the name of the cache. This is used to identify the cache. It must be unique.
        maxInMemory       - Sets the maximum number of objects that will be created in memory
        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
                            is never expired.
        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
                            if the element is not eternal. Idle time is now - last accessed time
        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
                            if the element is not eternal. TTL is now - creation time
        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
                            has reached the maxInMemory limit.

        
-->

    
<!-- Sample cache named sampleCache1
        This cache contains a maximum in memory of 10000 elements, and will expire
        an element if it is idle for more than 5 minutes and lives for more than
        10 minutes.

        If there are more than 10000 elements it will overflow to the
        disk cache, which in this configuration will go to wherever java.io.tmp is
        defined on your system. On a standard Linux system this will be /tmp"
        
-->
    
<cache name="sampleCache1"
        maxElementsInMemory
="10000"
        eternal
="false"
        timeToIdleSeconds
="300"
        timeToLiveSeconds
="600"
        overflowToDisk
="true"
        
/>

    
<!-- Sample cache named sampleCache2
        This cache contains 1000 elements. Elements will always be held in memory.
        They are not expired. 
-->
    
<cache name="sampleCache2"
        maxElementsInMemory
="1000"
        eternal
="true"
        timeToIdleSeconds
="0"
        timeToLiveSeconds
="0"
        overflowToDisk
="false"
        
/> -->

    
<!-- Place configuration for your caches following -->

</ehcache>
b)hibernate.cfg.xml
        <property name="cache.use_second_level_cache">true</property>
        
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
c)在需要使用缓存的实体类上加标注
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
d)测试用例:
    @Test
    
public void testCache1() {
        Session session 
= sf.openSession();
        session.beginTransaction();
        Category c 
= (Category) session.load(Category.class1);
        System.out.println(c.getName());
        session.getTransaction().commit();
        session.close();

        Session session2 
= sf.openSession();
        session2.beginTransaction();
        Category c2 
= (Category) session2.load(Category.class1);
        System.out.println(c2.getName());
        session2.getTransaction().commit();
        session2.close();

    }
3、查询缓存(三级缓存)
Query缓存,查询语句相同时会使用。
a)hibernate.cfg.xml
        <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        
<property name="cache.use_query_cache">true</property>
b)测试用例:
    @Test
    
public void testQueryCache() {
        Session session 
= sf.openSession();
        session.beginTransaction();
        List
<Category> q = session.createQuery("from Category c where c.id>?")
                .setCacheable(
true)
                .setInteger(
03)
                .list();
        session.getTransaction().commit();
        session.close();

        Session session2 
= sf.openSession();
        session2.beginTransaction();

        List
<Category> q2 = session2
                .createQuery(
"from Category c where c.id>?")
                .setCacheable(
true)
                .setInteger(
03)
                .list();
        session2.getTransaction().commit();
        session2.close();

    }



二级缓存适合放什么对象?
1、经常被访问
2、改动不大(不会被经常改动)
3、数量有限

load默认使用二级缓存,iterator默认使用二级缓存
list默认往二级缓存加数据,但是查询的时候不使用

缓存算法:
LRU(Least Recently Used)最近很少使用的对象会被删除
LFU(Least Frequently Used)命中率低的对象会被删除
FIFO(First In First Out)先进先出