HibernateORMSpring性能优化技术笔录资料整理

Spring Jpa中二级缓存的使用.

FavoriteLoadingAdd to favorites
引言:前两个月写有“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添加接口的实现
    @ReadOnly
    public 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,具体的端口自行修改。

结果如下:
 
jpa-cache-1
 
其实结果是可想而知的,主要看一下后台的输出,如下:
jpa-cache-2
 
以上不是全部的内容,主要是与二级缓存相关的输出,可以看出,首先检测了二级缓存,没有之后执行了查询并且存放到了二级缓存中。
那再次刷新一下呢?浏览器中当然一样,再看看后台的输出,如下:
 
jpa-cache-3
 
以上也是部分内容,不过已经足以看出二级缓存已经起效了。
 
6. 对象中集合的缓存配置
 
如果在缓存的对象中有集合,那就使用如下的配置即可,也就能将缓存对象中的集合也缓存起来。
@OneToMany(fetch = FetchType.EAGER,mappedBy = “parent”)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private List<Object> list;
配置类似,这里就不测试了。
 
本文只阐述了如何使用耳机缓存,不涉及性能问题,具体的性能优化方案,还需根据项目来定了,谢谢。
 
如有问题,欢迎指出;如需转载,请标明出处,谢谢!
 
参考资料