性能优化之Hibernate4配置二级缓存

配置JavaBean缓存的三种方式

①在使用JPA规范的bean中,添加@Cache注解,eg.

@Entity
@Table(name = “t_area”)
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
class Area{…}

hibernate有4种并发访问策略:
· read-only:适合只读事务,不会被修改的数据采用该策略并发性能最高。
· read-write:提供read committed数据库隔离级别。对于经常被读但很少修改的数据可以采用这种策略,可防脏读。
· nonstrict-read-write:非严格读写不能保证缓存与数据库中数据的一致性,若有两个事务并发访问缓存数据,则应配置一个很短的过期时间,以减少读脏数据的可能。对于极少被修改且可容忍偶尔脏读的数据可以采用这种并发策略,适合高并发读写事务。
· transactional:事务序列化,提供了Repeatable Read事务隔离级别,可防脏读和不可重复读。
目前还没有提供商能够支持全部策略。

②hibernate.cfg.xml中的标签配置方式: <class-cache class="" usage="" />
③实体类的映射文件*.hb.xml中的标签配置方式: <cache usage=" />


配置步骤

在绘制类似于热力图等,后台返回的JSON数据通常可以达1M以上甚至更多,这时候可以考虑压缩数据,例如GZIP。再考虑该数据是否基本不做修改,或者被修改的概率足够低,这时二级缓存的策略就是性能优化的一种好的选择。
然而在配置hibernate二级缓存的时候,大家应该先知道hibernate3和hibernate4的配置方式有着细微的差别。防止用错方案走弯路。
博主主要就hibernate4的配置做讲解:
①进入hibernate-release-4.2.4.Final\lib\optional\ehcache目录,把ehcache-core-2.4.3.jar、hibernate-ehcache-4.2.4.Final.jar、slf4j-api-1.6.1.jar拷入项目的lib.
②配置hibernate.cfg.xml文件。

<!-- 开启二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 配置二级缓存使用的产品,RegionFactory为Ehcache的RegionFactory -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 默认情况下,查询缓存对HQL及QBC(Criteria)查询无效,可以启用如下设置 -->
<property name="cache.use_query_cache">true</property>
<!-- 记得在criteria查询中调用 setCacheable(true) 方法 -->
<!-- 配置管理session的方式 -->
<property name="current_session_context_class">thread</property>
<!-- 二级缓存配置文件的位置 添加配置文件 
【ehcache.xml一般放在classpath或src下,也可以自定义文件名和路径,
并在hibernate.cfg.xml中通过hibernate.cache.provider_configuration_file_resource_path参数指定 】-->
<!-- <property name="hibernate.cache.provider_configuration_file_resource_path">.../ehcache.xml</property> -->

Hibernate 自身提供了三种管理 Session 对象的方法:

thread: Session 对象的生命周期与本地线程绑定
jta*: Session 对象的生命周期与 JTA 事务绑定
managed: Hibernate 委托程序来管理 Session 对象的生命周期


小插曲:遇到java.lang.NoClassDefFoundError: org/hibernate/cache/spi/RegionFactory 错误
原因:观察项目的Maven关联,发现hibernate-core-4.0.1.Final.jar,即系统架构的hibernate版本是4.0.1的,引入hibernate-ehcache-4.2.4.Final.jar的ehcache方案与该版本号发生冲突。
解决方式:消除冲突,Google下载hibernate-ehcache-4.0.1.Final.jar,与项目架构版本一致。

实体层层代码:

@Entity
@Table(name = "history_station_user")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class HistoryStationUser {
    @Id
    @Column(name = "id")
    @Type(type = "string")
    private String id;

    @Column(name = "year")
    @Type(type = "int")
    private Integer year;

    @Column(name = "month")
    @Type(type = "int")
    private Integer month;
    ...
}

Dao层代码:

public List cacheableList(Class target, List criterions) {
    Session session = this.getSession();
    session.clear();
    Transaction tran = session.beginTransaction();

    List list = this.createCriteria(session, target, criterions)//
            .setCacheable(true)//把可缓存设置为true,二级缓存才能生效
            .list();

    tran.commit();
    session.flush();
    session.close();
    return list;
}

以上为配置Hibernate4配置二级缓存的步骤。仅演示基于JPA的方法,其余两种方法同理也容易配置。


作者: @nanphonfy
Email: nanphonfy (Nfzone) gmail.com 请将(Nfzone)换成@


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值