本帖最后由 鱼丸儿 于 2018-1-20 11:44 编辑
大家好,今天来记录讲解一下磕磕绊绊的hibernate5 的二级缓存配置,一条路摸到黑 那么在这之前我们先了解一下hibernate的一级缓存和二级缓存分别是什么? 说句通俗的话就是 一级缓存的信息只能在同一个session间传递,而二级缓存是不同的session间可以访问的,可以跨越Session存在,可以被多个Session所共享。需要第三方缓存框架的加持
那么什么数据适合放到二级缓存中呢? 便是那些不经常改动又经常被访问的数据,比如省市信息等,前台页面经常查询而没必要每次都要去数据库查询!
那么有什么三方框架可以支持hibernate的二级缓存呢? EHCache: 可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持 OpenSymphony:可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持 SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存 JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存
好,那么我们接下来就以EHCache来介绍一下hibernate二级缓存的用法
第一步:导入jar包(jar包附件给出)
[Java]
纯文本查看 复制代码
1
2
3
|
ehcache-core-
2.4
.
3
.jar
hibernate-ehcache-
5.0
.
7
.Final.jar
commons-logging-
1.1
.
1
.jar
|
第二步:声明缓存(在hibernate.cfg.xml 中配置)
[XML]
纯文本查看 复制代码
1
2
3
4
5
6
7
|
<
property
name
=
"hibernate.cache.use_second_level_cache"
>true</
property
>
<
property
name
=
"hibernate.cache.region.factory_class"
>org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</
property
>
<
property
name
=
"hibernate.cache.use_query_cache"
>true</
property
>
|
第三步:需要设置EHCache配置文件
[XML]
纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<
ehcache
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation
=
"../config/ehcache.xsd"
>
<
diskStore
path
=
"C:/ehcache"
/>
<
defaultCache
maxElementsInMemory
=
"10000"
eternal
=
"false"
timeToIdleSeconds
=
"120"
timeToLiveSeconds
=
"120"
overflowToDisk
=
"true"
maxElementsOnDisk
=
"10000000"
diskExpiryThreadIntervalSeconds
=
"120"
memoryStoreEvictionPolicy
=
"LRU"
/>
</
ehcache
>
|
第四步:指定什么对象也就是model可以加入缓存 有两种配置方式,可以在hbm中创建安,也可以在cfg文件中创建 我们这里就以cfg文件配置为例
[XML]
纯文本查看 复制代码
1
2
3
4
|
<
class-cache
usage
=
"read-write"
class
=
"cn.patronli.domain.Order"
/> <!-缓存的是对象-
<
collection-cache
usage
=
"read-write"
collection
=
"cn.patronli.domain.Customer.orders"
/> <!-缓存的是集合-
为了保险起见 我们需要给相对应的model 实现一个序列化接口 implements Serializable
|
那么如何在hbm中设置呢?需要再class后紧跟缓存配置,如下所示
[XML]
纯文本查看 复制代码
1
2
|
<
class
name
=
"Customer"
table
=
"t_customer"
catalog
=
"hibernateTest"
lazy
=
"true"
>
<
cache
usage
=
"read-write"
/>
|
以上配置二选一 !!!!
那么最后我们就可以来进行测试了
[Java]
纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public
static
void
main(String[] args) {
Session s1 = HibernateUtils.openSession();
s1.beginTransaction();
Customer c1 = (Customer) s1.get(Customer.
class
,
1
);
System.out.println(c1.getName());
s1.getTransaction().commit();
s1.close();
Session s2 = HibernateUtils.openSession();
s2.beginTransaction();
Customer c2 = (Customer) s2.get(Customer.
class
,
1
);
System.out.println(c2.getName());
}
|
不知道你学会了没有?
|
|
转载于:https://www.cnblogs.com/bigben0123/p/8968949.html