缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.
Hibernate
在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升.
Hibernate
缓存分类:
Session缓存,一级缓存.
SessionFactory的缓存分为内置缓存和外置缓存.内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据
及预定义SQL语句等),对于应用程序来说,它是只读的.外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质
外,还可以选用硬盘等外部存储设备.
Hibernate
的缓存范围
Hibernate
的一级缓存和二级缓存都位于均位于持久层,且均用于存放数据库数据的副本,最大的区别就是缓存的范围各不一样.
缓存的范围分为3类:
1.事务范围
事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.
2.应用范围
应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.
3.集群范围
在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.
Hibernate
的缓存管理
一级缓存的管理:
evit(Object obj)
将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象.
clear()
将一级缓存中的所有持久化对象清除,释放其占用的内存资源
contains(Object obj)
判断指定的对象是否存在于一级缓存中.
flush()
刷新一级缓存区的内容,使之与数据库数据保持同步.
二级缓存的管理:
evict(Class arg0, Serializable arg1)
将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.
-
sessionFactory.evict(Customer.
class
,
new
Integer(
1
));
sessionFactory.evict(Customer.class, new Integer(1));
evict(Class arg0)
将指定类的所有持久化对象从二级缓存中清除,释放其占用的内存资源.
-
sessionFactory.evict(Customer.
class
);
sessionFactory.evict(Customer.class);
evictCollection(String arg0)
将指定类的所有持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源.
-
sessionFactory.evictCollection(
"Customer.orders"
);
sessionFactory.evictCollection("Customer.orders");
Hibernate
的二级缓存的配置
首先,不是所有的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来?
下面这几种情况就不适合
加载到二级缓存中:
1.经常被修改的数据
2.绝对不允许出现并发访问的数据
3.与其他应用共享的数据
下面这己种情况合适
加载到二级缓存中:
1.数据更新频率低
2.允许偶尔出现并发问题的非重要数据
3.不会被并发访问的数据
4.常量数据
5.不会被第三方修改的数据
Hibernate
的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate
为了集成这些插件,Hibernate
提供了org.hibernate
.cache.CacheProvider借口,它充当缓存插件与Hibernate
之间的适配器 .
常用的二级缓存插件
EHCache org.hibernate
.cache.EhCacheProvider
OSCache org.hibernate
.cache.OSCacheProvider
SwarmCahe org.hibernate
.cache.SwarmCacheProvider
JBossCache org.hibernate
.cache.TreeCacheProvider
简单介绍一下EHCache的配置
hibernate
.cfg.xml
-
<
hibernate
-configuration
>
-
<
session-factory
>
-
-
<
property
name
=
"hibernate
.cache.provider_class"
>
-
org.hibernate
.cache.EhCacheProvider
-
</
property
>
-
-
<
property
name
=
"hibernate
.cache.use_query_cache"
>
-
true
-
</
property
>
-
</
session-factory
>
-
</
hibernate
-configuration
>
<hibernate
-configuration>
<session-factory>
<!-- 设置二级缓存插件EHCache的Provider类-->
<property name="hibernate
.cache.provider_class">
org.hibernate
.cache.EhCacheProvider
</property>
<!-- 启动"查询缓存" -->
<property name="hibernate
.cache.use_query_cache">
true
</property>
</session-factory>
</hibernate
-configuration>
ehcache.xml
-
<
ehcache
>
-
-
<
diskStore
path
=
"java.io.tmpdir"
/>
-
<
defaultCache
maxElementsInMemory
=
"10000"
eternal
=
"false"
timeToIdleSeconds
=
"300"
timeToLiveSeconds
=
"600"
overflowToDisk
=
"true"
/>
-
</
ehcache
>
<ehcache>
<!-- maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过期,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数 -->
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>
</ehcache>
****.hbm.xml
-
<?
xml
version
=
"1.0"
encoding
=
'UTF-8'
?>
-
<!DOCTYPE hibernate
-mapping PUBLIC
-
"-//Hibernate
/Hibernate
Mapping DTD 3.0//EN"
-
"http://hibernate
.sourceforge.net/hibernate
-mapping-3.0.dtd" >
-
-
<
hibernate
-mapping
>
-
-
<
class
>
-
-
<
cache
usage
=
"read-write"
/>
-
</
class
>
-
-
</
hibernate
-mapping
>
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate
-mapping PUBLIC
"-//Hibernate
/Hibernate
Mapping DTD 3.0//EN"
"http://hibernate
.sourceforge.net/hibernate
-mapping-3.0.dtd" >
<hibernate
-mapping>
<class>
<!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-write transactional-->
<cache usage="read-write"/>
</class>
</hibernate
-mapping>
分享到:
相关推荐
Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...
Hibernate缓存机制.txt
Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...
**标题:“Hibernate缓存机制,转载”** **描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:*...
hibernate缓存机制,你必须学的持久层技术。
《Hibernate缓存机制详解》 Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。其缓存机制是优化性能的关键组成部分,它减少了对数据库的直接访问,提高了数据处理效率。本文...
## Hibernate缓存机制详解 ### 一、缓存分类与管理 Hibernate提供了两种主要的缓存类型:一级缓存和二级缓存。 #### 1. 一级缓存 一级缓存也称为Session缓存,它在同一个Session中对数据的多次读取操作只需要一...
在配置Hibernate缓存时,需要明确哪些实体或查询结果应该缓存,并设置相应的缓存策略。例如,我们可以使用`@Cacheable`注解标记实体类,使用`@Cache`注解来定义缓存区域和策略。同时,对于查询结果的缓存,可以使用`...
### Hibernate缓存机制详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它简化了 Java 应用程序与数据库交互的过程。然而,直接使用 JDBC 访问数据库存在一定的性能开销。为了提升性能,Hibernate ...
Hibernate缓存介于Hibernate应用和数据库之间,缓存中存放了数据库数据的拷贝。 其作用是减少访问数据库的频率,从而提高应用的运行性能
**Hibernate缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...
### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...
### Hibernate的缓存机制 #### 缓存的基本概念 缓存技术在软件开发中扮演着重要的角色,尤其是在提高数据访问效率方面。缓存通常被放置在应用程序与物理数据源(如数据库)之间,目的是减少对物理数据源的访问频率...
**标题:“Hibernate的缓存机制”** 在Java的持久化框架Hibernate中,缓存机制扮演着至关重要的角色,它能够显著提升数据访问的性能。缓存可以分为一级缓存和二级缓存,以及查询缓存。 **一级缓存**: 一级缓存是...