首先说明一下最初什么都不懂想用hibernate二级缓存的原因:手头项目是个商城网站,大量用户访问,就想到缓存
在经朋友推荐,初步看了以下二级缓存的功能,看似很符合需求,但是实际构建后,应用起来却发现并不是那么回事。但
既然已经了解了,不妨就稍微记下来。
hibernate二级缓存不适用项目的原因是因为它只能缓存通过id查询的实体(类)对象,而我们通常查询商品是通过使用
hql来查询带有较为复杂关联的对象,而并不是简单的通过id查询对象。所以在本次项目中,我没有使用,因为我发出十几条
查询语句,只有一句是通过Id来查询的,使用二级缓存就显得没有什么意义。
说明:
hibernate的二级缓存策略一般是这样,查询的时候我们发出hql或者是sql,里面通常是带where条件以及排序、分组参数的,
查询到结果以后,hibernate会把查询到的所有结果根据id存到二级缓存里。
然后当hibernate根据id访问数据对象的时候,会先去session一级缓存找,找不到,再去二级缓存里找,如果缓存里面都没有,
就去数据库查了。
因为二级缓存是针对id的,所以对于我们这种需要比较多条件动态参数组合的情景就显得没有什么用处
虽然没用,但是也要记下怎么做的。
项目类型:WebProject
项目环境:spring4.2.9-mvc、hibernate4.3.11.Final
我们需要到hibernate官方下载包,这里可以直接百度hibernate就可以。
我下载的是:hibernate-release-4.3.11.Final
是个压缩文件,解压后,hibernate-release-4.3.11.Final\lib\optional\ehcache
把上面的路径下的jar包导入项目中。
spring-xml文件:
配置完了之后,我们就进入我们的实体类。(我使用注解映射实体,不是用hibernate.xml配的)
然后如果有外键的话,也要加
@ManyToOne(fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@JoinColumn(name = "F_CLAUSE_ID", nullable = false)
public Clause getClause() {
return clause;
}
完成后,我是在dao的实现中添加的,由于有一个继承和实现的基础类和接口,所以我重写了其中的方法:
要是不写也有点效果,可以少点因为外键关联查询多发出的sql请求。
这样就可以了。
我们可以打开hibernate的配置,在控制台输出hibernate发出的sql来查看是否缓存好了。
我们可以通过eclipse或者是MyEclipse的控制台看到,在我们前端第二次发起同一个请求的时候,
后台并没有像第一次前端发出请求时候,打出那个通过id查询的sql语句,说明hibernate进行数据库操作的时候,
使用了hibernate的二级缓存,所以没有从数据获取。
宁波眼部整形:http://www.iyestar.com/ybzx/