引言:前两个月写有“Spring and JPA的框架集成和编码测试.”和“JPA Criteria查询的支持及使用.”两篇文章,其中主要包含了框架的集成和相关代码的演示。今天这篇是基于以上文章进行扩展的,主要是对二级缓存的的初级使用,以便于性能优化,但本文不涉及性能优化,只是初级的配置及使用。另外,您还可以看看,“Hibernate Cache的深入认识.”这篇文章,相信看完这篇之后,再来看本篇,会游刃有余,印象更加的深刻。
如果您没有看过“Spring and JPA的框架集成和编码测试.”及“JPA Criteria查询的支持及使用.”两篇文章,建议先去看一下。以下的配置和代码演示,都是基于这两篇中的演示代码。
准备
本文也是使用ehcache插件,所以要添加相关的JAR包。
列表如下:
hibernate-ehcache-4.2.4.Final.jar
ehcache-core-2.4.3.jar
添加二级缓存配置
1. 在applicationContext.xml配置文件下,添加如下配置。
<!– entityManagerFactory –><bean id=”entityManagerFactory” class=”org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean”><property name=”dataSource” ref=”dataSource”/><property name=”packagesToScan” value=”com.stark.demo.entitys” /><!– jpa实体包 –><property name=”persistenceProvider” ref=”persistenceProvider” /><property name=”jpaVendorAdapter” ref=”jpaVendorAdapter” /><property name=”jpaDialect” ref=”jpaDialect” /><!– 二级缓存配置 –><property name=”jpaProperties”><props><prop key=”hibernate.cache.region.factory_class”>org.hibernate.cache.ehcache.EhCacheRegionFactory</prop><!– <prop key=”javax.persistence.sharedCache.mode”>ENABLE_SELECTIVE</prop> –><!– 统计功能<prop key=”hibernate.generate_statistics”>true</prop> –><!– 查询缓存<prop key=”hibernate.cache.use_query_cache”>true</prop> –></props></property></bean>
说明:如果在配置文件中加入了<prop key=”javax.persistence.sharedCache.mode”>ENABLE_SELECTIVE</prop>,则不需要在实体内配置hibernate的 @cache标记,只要打上JPA的@cacheable标记即可默认开启该实体的二级缓存。如果不使用javax.persistence.sharedCache.mode配置,直接在实体内打@cache标记也可以。不过建议使用@cache标签,后面可以对指定对象指定对应的缓存策略。统计功能上线不建议开启。查询缓存先不开启。
2. 在User实体上添加@cache注解
/*** 省略import等* 用户实体类*/@Entity@Table(name=”USER”)@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)public class User implements Serializable {private static final long serialVersionUID = -6395834411937686352L;@Id@Column(name = “ID”, length = 32)@GeneratedValue(generator = “system-uuid”)@GenericGenerator(name = “system-uuid”, strategy = “uuid”)private String id;//唯一id,使用uuid生成策略@Column(name = “NAME”, length = 50)private String name;//用户名@Column(name = “PWD”, length = 50)private String pwd;//用户密码@Column(name = “STATE”, length = 2)private String state;//0表示禁用,1表示启用@Column(name = “DESCRIPTION”, length = 200)private String description;//描述信息/** 省略get和set **/}
注:在hibernate的需要设置属性cache.use_second_level_cache为true,而在JPA中,只要实体上注有@cache标记,就自动开启了。
查询缓存的使用及测试
在上面的配置中,打开“查询缓存”的配置项。注意:在Hibernate和JPA中,key值不同,但是类似。
下一步就是在JpaRepository的数据接口上添加上缓存的注解即可,注解使用@QueryHint来实现。
1. 在UserDao中添加方法及缓存注解
如下:
/** 省略import等 **/public interface UserDao extends CrudRepository<User, String>,JpaSpecificationExecutor<User> {@Query(“SELECT t FROM User”)@QueryHints({@QueryHint(name = “org.hibernate.cacheable”, value =”true”) })public List<User> findListByCache();}
2. 在IUserService中添加方法
/*** 开启二级查询缓存的列表查询* @return* @throws Exception*/public List<User> findListByCache() throws Exception;
3. 在UserServiceImpl添加接口的实现
@ReadOnlypublic List<User> findListByCache() throws Exception {List<User> userList = new ArrayList<User>();try {userList = this.userDao.findListByCache();} catch (Exception e) {System.out.println(“出错信息:” + e.getMessage());}return userList;}
4. 在UserController中添加请求
/*** 通过查询缓存获取指定条件的用户列表* @param request* @return* @throws Exception*/@ResponseBody@RequestMapping(“/userlistCache.do”)public Object userlistCache(HttpServletRequest request) throws Exception{//查询缓存数据List<User> userList = this.userService.findListByCache();return userList;}
5. 测试
运行项目之后,在浏览器中输入:http://localhost:8082/stark-spring-jpa-demo/user/userlistCache.do,具体的端口自行修改。
结果如下:
其实结果是可想而知的,主要看一下后台的输出,如下:
以上不是全部的内容,主要是与二级缓存相关的输出,可以看出,首先检测了二级缓存,没有之后执行了查询并且存放到了二级缓存中。
那再次刷新一下呢?浏览器中当然一样,再看看后台的输出,如下:
以上也是部分内容,不过已经足以看出二级缓存已经起效了。
6. 对象中集合的缓存配置
如果在缓存的对象中有集合,那就使用如下的配置即可,也就能将缓存对象中的集合也缓存起来。
@OneToMany(fetch = FetchType.EAGER,mappedBy = “parent”)@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)private List<Object> list;
配置类似,这里就不测试了。
本文只阐述了如何使用耳机缓存,不涉及性能问题,具体的性能优化方案,还需根据项目来定了,谢谢。
如有问题,欢迎指出;如需转载,请标明出处,谢谢!
参考资料