what
其实你就可以想象成一个 Map ,通过 key 在缓存里面找 value 。类似于session这种东西
来一个比较官方的解释
缓存是数据库数据临时容器,它包含了库表数据的临时拷贝,位于数据库与数据访问层之间。ORM进行数据读取时,会根据其缓存管理策略,首先在内存中查询,如果在内存中发现所需数据(缓存命中),则直接以此数据错位查询结果加以利用,从而避免了数据库调用的性能开销。
why
EhCache是Hibernate的二级缓存技术之一,可以把查询出来的数据存储在内存或者磁盘,节省下次同样查询语句再次查询数据库,大幅减轻数据库压力;
how
我是在spring boot框架下的配置
在application.properties配置中打开二级缓存
spring.jpa.properties.hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.net.sf.ehcache.configurationResourceName = config/cache/ehcache.hibernate.xml
spring.jpa.properties.javax.persistence.sharedCache.mode = ENABLE_SELECTIVE
spring.jpa.properties.hibernate.generate_statistics=true
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
在实体类中添加缓存注解
@Des("所属组织")
@ManyToOne
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Org org;
在config下面的cache中配置ehcache.hibernate.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" name="hibernateServicecache" updateCheck="false"
monitoring="autodetect" dynamicConfig="true">
<diskStore path="java.io.tmpdir/ehcache" />
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
maxElementsOnDisk="10000000" diskPersistent="false"
diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" >
</defaultCache>
</ehcache>
缓存策略详解
- 1),Read-only
只读。对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。 - 2),Nonstrict-read-write
非严格读写。如果程序对并发访问下的数据同步要求不是非常严格,且数据更新操作频 率较低(几个小时以上),可以采用这种并发访问策略,获得较好的性能。 - 3),Read-write
严格读写。提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题。 - 4),Transactional
事务。仅仅在托管环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读这类的并发问题。
如果有啥问题,大家一起探讨探讨!