一级缓存:
会话session、事务级别的,事务退出,缓存就失效了。以id为标识
实体管理器-数据源 操作数据拷贝而非数据源。
二级缓存:
线程级或集群级,以id为标识放到缓存(针对id)
过程:一级缓存、二级缓存(进程级、可配置和修改)-数据源
多个线程访问二级缓存,需要采取事务控制
桥接第三方缓存,hibernate二级缓存的实现:
1.ehcache
2.OScache
3.JBossCache
4.Memcached
......
什么样的数据适合二级缓存呢?
1.很少被修改的数据
2.不是很重要,允许偶尔出现并发的数据
3.不会被高并发访问的数据
4.参数数据,通常是数量有限,极少被修改,大量的被其它实例引用的
不适合使用二级缓存?
1.经常被修改的数据,代价太大,得不偿失
2.金钱敏感的数据,绝对不允许出现并发
3.与其他应用共享的数据
查询缓存:
批量的缓存、批量的获取,如按查询条件、查询结果进行缓存;
JPA+Ehcache缓存配置:
1.加入Ehcache依赖
<!--Ehcache-core 包 --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.6.9</version> </dependency> <!--添加Hibernate-Ehcache包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate-version}</version> </dependency>
2.配置ehcache.xml
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <diskStore path="java.io.tmpdir/ehcache"/> <!-- 默认缓存 --> <defaultCache maxElementsInMemory="1000" <!-- 默认缓存中存最多数据项目 --> eternal="false" <!--是否永不过期--> timeToIdleSeconds="120" <!--空闲多长时间后从缓存中删除--> timeToLiveSeconds="120" <!--活跃多长时间后从缓存中删除--> overflowToDisk="false"/><!--超过maxElementsInMemory之后是否存储到硬盘--> <!-- 题目缓存--> <cache name="questionCache" maxElementsInMemory="1000" eternal="true" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" memoryStoreEvictionPolicy="LRU" <!--数据项失效策略--> /> </ehcache>
3.persistence.xml配置加入缓存配置
<prop key="hibernate.cache.use_query_cache">true</prop> <!--开启查询缓存--> <property name="hibernate.cache.use_second_level_cache">true</property><!--开启二级缓存--> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <!--ehcache支持--> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!--ehcache支持--> <property name="hibernate.cache.provider_configuration">classpath:ehcache.xml</property><!--ehcache详细配置-->
4.注解配置
未完待续...
时间: 2024-10-12 22:02:59