前言
采用hibernate的JPA实现,对于简单的查询十分方便。而对于复杂查询我们也可以写SQL来进行复杂的多表连接查询。很多人不喜欢hibernate其实更多的是对其机制的掌握不深,如果认真研究其实现源码,其实是一个很快乐的学习过程。各种设计范式的运用也是精彩绝伦。
这里主要说下缓存的配置。既然是hibernate,其缓存机制离不开这三种:session级别的缓存、sessionFactory级别的二级缓存以及查询缓存和带有集合的缓存。对于jpa的使用,个人建议不要使用关系映射。这样会导致各种关联查询,涉及到延迟加载等机制,会消耗额外的cglib的大量代理工作。尤其是很多人还使用org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter来实现集合的页面懒加载。这对http响应要求很高的系统简直就是灾难。
使用jpa要放弃hibernate的关系映射部分,保持开发的简洁和灵活性。
先上测试代码
|
|
一级缓存
也就是自建的session级别的缓存,在一个session回话事物中根据主键查询是只会查询一次数据库的。
|
|
控制台打印:
|
|
执行entityManager.close();
entityManager关闭后会重新执行一次sql查询
二级缓存
二级缓存默认是关闭的,需要配置缓存策略
|
|
然后在需要使用缓存的entity配置好缓存注解
|
|
当然还要配置好ehcache.xml
|
|
运行测试代码会发现两次执行只有一次sql查询
查询缓存
前两种都是对主键查询时候的缓存,对于普通的sql查询我们可以在repository中配置hints
|
|
运行测试代码
|
|
控制台输出
|
|
这可以看到第二次执行同样的查询会有L2C缓存命中
总结
如何配置二级缓存和注意事项
- 首先需要添加pom依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 复制代码
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>${spring-data-jpa.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> 复制代码
一定要注意ehcache和hibernate的版本要一致,不然启动会报错。
- 修改jpa配置
1 2 3 4 5 6 7 复制代码
<prop key="hibernate.generate_statistics">true</prop> <!-- 配置二级缓存 --> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <!-- 开启查询缓存 --> <prop key="hibernate.cache.use_query_cache">true</prop> <prop key="hibernate.cache.provider_configuration">classpath:ehcache.xml</prop> 复制代码
这里开启了二级缓存和查询缓存,指定了ehcache缓存的配置文件statistics是个调试开关,可以查询缓存的命中情况
- ehcache.xml配置
1 2 3 4 5 6 7 复制代码
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> 复制代码
timeToIdleSeconds
这个是缓存的最大空闲时间,也就是多久不访问自动失效timeToLiveSeconds
这个是最大存活时间,如果在存活时间内空闲时间达到上限,缓存也会自动失效。
4)给entity配置缓存策略
|
|
cacheable主要对集合类的缓存提供支持,缓存策略这里适合数据更新不多的情况进行设置。
end
使用二级缓存和查询缓存要注意使用场景,如果发现增加缓存机制系统反而出现吞吐下降频发宕机。就要考虑是不是该换memcache等专门的缓存服务器了。