二级缓存
也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
二级缓存是由不同的提供商提供,默认情况下,Hibernate使用EHCache进行JVM级别的缓存。
缓存策略提供商如下表:
Cache
Provider class
Type
Cluster Safe
Query Cache Supported
Hashtable (not intended for production use) |
org.hibernate.cache.HashtableCacheProvider
|
memory |
|
yes |
EHCache |
org.hibernate.cache.EhCacheProvider
|
memory, disk |
|
yes |
OSCache |
org.hibernate.cache.OSCacheProvider
|
memory, disk |
|
yes |
SwarmCache |
org.hibernate.cache.SwarmCacheProvider
|
clustered (ip multicast) |
yes (clustered invalidation) |
|
JBoss TreeCache |
org.hibernate.cache.TreeCacheProvider
|
clustered (ip multicast), transactional |
yes (replication) |
yes (clock sync req.) |
EHCache是不支持集群的。
下面以EHCache为例说明二级缓存的配置和使用:
(1)将echache.xml文件拷贝到相应的目录下。
(2)开启二级缓存,修改hibernate.cfg.xml文件
<property
name=
"hibernate.cache.use_second_level_cache"
>
true
</property>
(3)指定缓存产品提供商,修改hibernate.cfg.xml文件
<property
name=
"hibernate.cache.provider_class"
>
org.hibernate.cache.EhCacheProvider
</property>
(4)指定哪些实体使用二级缓存(两种方法)
*在实体映射文件中采用<cache>标签
<cache
usage=
"transactional|read-write|nonstrict-read-write|read-only"
(1)
region=
"RegionName"
(2)
include=
"all|non-lazy"
(3)
/>
(1) |
usage
(必须)说明了缓存的策略: transactional
、 read-write
、 nonstrict-read-write
或 read-only
。
|
(2) |
region
(可选, 默认为类或者集合的名字(class or
collection role name)) 指定第二级缓存的区域名(name of
the second level cache region)
|
(3) |
include
(可选,默认为 all
) non-lazy
当属性级延迟抓取打开时, 标记为lazy="true"
的实体的属性可能无法被缓存
|
如: <cache
usage=
"read-only"
/>
*在hibernate.cfg.xml文件中,采用<class-cache>标签
<class-cache
class=
"com.Student"
usage=
"read-only"
/>
建议使用这种方法,因为这样就能知道整个项目中哪些实体使用了二级缓存,很一目发然。
这里usage
属性指明了缓存并发策略(cache concurrency strategy)
*只读缓存(Strategy: read only)
如果你的应用程序只需读取一个持久化类的实例,而无需对其修改, 那么就可以对其进行只读 缓存。这是最简单,也是实用性最好的方法。甚至在集群中,它也能完美地运作。
*读/写缓存(Strategy: read/write)
如果应用程序需要更新数据,那么使用读/写缓存 比较合适。 如果应用程序要求“序列化事务”的隔离级别(serializable
transaction isolation level),那么就决不能使用这种缓存策略。
如果在JTA环境中使用缓存,你必须指定hibernate.transaction.manager_lookup_class属性的值,
通过它,Hibernate才能知道该应用程序中JTA的TransactionManager的具体策略。
在其它环境中,你必须保证在Session.close()、或Session.disconnect()调用前, 整个事务已经结束。
如果你想在集群环境中使用此策略,你必须保证底层的缓存实现支持锁定(locking)。Hibernate内置的缓存策略并不支持锁定功能。
<class
name=
"eg.Cat"
....
>
<cache
usage=
"read-write"
/>
....
<set
name=
"kittens"
...
>
<cache
usage=
"read-write"
/>
....
</set>
</class>
*非严格读/写缓存(Strategy: nonstrict read/write)
如果应用程序只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,
那么比较适合使用非严格读/写缓存策略。如果在JTA环境中使用该策略,
你必须为其指定hibernate.transaction.manager_lookup_class属性的值,
在其它环境中,你必须保证在Session.close()、或Session.disconnect()调用前, 整个事务已经结束。
*事务缓存(transactional)
Hibernate的事务缓存策略提供了全事务的缓存支持, 例如对JBoss TreeCache的支持。这样的缓存只能用于JTA环境中,你必须指定为其hibernate.transaction.manager_lookup_class属性。
没有一种缓存提供商能够支持上列的所有缓存并发策略。下表中列出了各种提供器、及其各自适用的并发策略。
Cache
read-only
nonstrict-read-write
read-write
transactional
Hashtable (not intended for production use) |
yes |
yes |
yes |
|
EHCache |
yes |
yes |
yes |
|
OSCache |
yes |
yes |
yes |
|
SwarmCache |
yes |
yes |
|
|
JBoss TreeCache |
yes |
|
|
yes |
下面写了一个测试类,一个方法中两次开启session,查询同一条记录:
public
void
testLoad1
(){
Session
session
=
null
;
try
{
session
=
HibernateUtils
.
getSession
();
session
.
beginTransaction
();
Student
s =
(Student
)session
.
load
(Student
.
class
,
1
);
System
.
out
.
println
("student.name="
+
s.
getName
());
session
.
beginTransaction
().
commit
();
}
catch
(Exception
e
){
e
.
printStackTrace
();
session
.
beginTransaction
().
rollback
();
}
finally
{
HibernateUtils
.
closeSession
(session
);
}
try
{
session
=
HibernateUtils
.
getSession
();
session
.
beginTransaction
();
Student
s =
(Student
)session
.
load
(Student
.
class
,
1
);
System
.
out
.
println
("student.name="
+
s.
getName
());
session
.
beginTransaction
().
commit
();
}
catch
(Exception
e
){
e
.
printStackTrace
();
session
.
beginTransaction
().
rollback
();
}
finally
{
HibernateUtils
.
closeSession
(session
);
}
}
执行结果:
21:38:27,703 WARN CacheFactory:43 - read-only cache configured for mutable class: com.Student
21:38:27,718 WARN EhCacheProvider:86 - Could not find configuration [com.Student]; using defaults.
Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_,
student0_.classesid as classesid0_0_ from Student student0_ where
student0_.id=?
student.name=aa
student.name=aa
只查询一次数据库,在跨session的操作中,由于开启了二级缓存,第二次session查询时,只要在缓存中查询就行,不用再去查询数据库。
对于二级缓存来说,在SessionFactory
中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合,来管理二级缓存。
sessionFactory
.
evict
(Cat
.
class
,
catId
); //evict a particular Cat
sessionFactory
.
evict
(Cat
.
class
); //evict all Cats
sessionFactory
.
evictCollection
("Cat.kittens"
,
catId
); //evict a particular collection of kittens
sessionFactory
.
evictCollection
("Cat.kittens"
); //evict all kitten collections
CacheMode
参数用于控制具体的Session如何与二级缓存进行交互。
-
CacheMode.NORMAL
- 从二级缓存中读、写数据。
-
CacheMode.GET
- 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。
-
CacheMode.PUT
- 仅向二级缓存写数据,但不从二级缓存中读数据。
-
CacheMode.REFRESH
- 仅向二级缓存写数据,但不从二级缓存中读数据。通过 hibernate.cache.use_minimal_puts
的设置,强制二级缓存从数据库中读取数据,刷新缓存内容。
分享到:
相关推荐
总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...
通过分析这些源码,我们可以更深入地理解Hibernate二级缓存的工作流程和实际应用。 ### 6. 注意事项 - 虽然二级缓存提高了效率,但过度依赖可能会导致数据一致性问题。因此,需要根据业务需求谨慎选择缓存策略。 -...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
**二、Hibernate二级缓存** 二级缓存是SessionFactory级别的,跨越了多个Session,可以被多个线程共享。它通常由第三方插件如EhCache、Infinispan等提供。二级缓存分为以下几种类型: 1. **集合缓存**:用于存储...
Hibernate 是一个非常流行的开源对象关系映射(ORM)框架,它允许 Java 开发人员将数据库操作转换...通过学习这些内容,开发者可以更好地理解并掌握如何在实际项目中有效利用 Hibernate 的二级缓存功能,提升系统性能。
通过理解和运用Hibernate的二级缓存,我们可以优化应用性能,减少数据库压力,但同时也需要注意缓存可能带来的问题,如数据一致性、内存管理和并发控制等。在实际项目中,结合业务需求和系统特点,合理配置和管理...
通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...
本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...
本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...
标题“hibernate二级缓存(包括注解方式)”指出了本文将探讨的是Hibernate框架中的二级缓存机制,并且会涉及使用注解的方式进行配置。Hibernate是一个流行的对象关系映射(ORM)框架,它允许开发者在Java应用中使用...
这里它被用作Hibernate二级缓存的实现方式,这意味着当数据首次从数据库中读取后,会被存储在memcached中,后续请求可以直接从缓存中获取,避免了频繁的数据库交互,从而提高了系统的响应速度。 **知识点详解:** ...
在这个项目中,"hibernate二级缓存 SSH" 的标题表明我们将探讨如何在SSH框架中实现Hibernate的二级缓存功能。Hibernate二级缓存是一个优化策略,它能提高数据访问性能,减少对数据库的直接访问。 首先,Struts2作为...
在深入探讨Hibernate二级缓存之前,我们首先需要理解Hibernate缓存机制的基本概念。Hibernate作为一款优秀的对象关系映射(ORM)框架,它提供了一种在Java应用与数据库之间进行对象到关系表转换的方式,简化了数据...
《深入理解Hibernate的一级缓存与二级缓存》 Hibernate作为一款强大的ORM框架,其缓存机制是优化数据库操作性能的关键之一。缓存主要分为一级缓存和二级缓存,它们各自承担着不同的职责,共同提升了数据访问的效率...
**一、Hibernate二级缓存** Hibernate一级缓存是指Session级别的缓存,它是默认开启的,每个Session都会维护一个对象缓存,用来存放该Session加载的实体对象。一级缓存的生命周期与Session相同,当Session关闭时,...
在Java的持久化框架Hibernate中,二级缓存是一个重要的性能优化工具。它允许应用程序存储已经查询过的数据,以便后续请求可以快速获取,而无需再次访问数据库。本实例着重讲解如何在Hibernate项目中配置和使用二级...
总之,Hibernate二级缓存是提升系统性能的重要手段,但正确配置和管理缓存至关重要。理解其工作原理,根据业务场景选择合适的缓存策略,才能最大化发挥其优势。在实际应用中,还需结合数据库设计、索引优化等多方面...
《深入理解Hibernate二级缓存:基于给定的配置与组件》 在Java的持久化框架领域,Hibernate无疑是最为广泛使用的工具之一。它提供了一种高效、便捷的方式来管理数据库对象,而其中的二级缓存机制则进一步提升了性能...