Hibernate的2层缓存机制:
第一层:session级别的缓存,hibernate本身就打开的,有一些缺陷,session关闭之后,缓存也就清理了。
另外,session级别的CRUD操作都会更新缓存,假如批量处理,可能会使内存溢出,可以使用两种方法清理
session缓存:1,session.evict(obj);2,session.clear();
session缓存的好处显而易见,但缺点也暴露无遗。
接着SessionFactory缓存就诞生了,也就是传说中的2级缓存,配置hibernate的2级缓存:
首先在hibernate.cfg.xml中添加
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.internal.OSCacheProvider</property>
然后把oscache.properties放到classpath下即可,默认配置即可,
其中只有一个属性配置cache.capacity=1000,但可以随意配置,10000,-1000000,看内存容量。
只有上述操作还是不行的,必须告诉hibernate要缓存那些对象。
也有2中配置方式:
第一种:在hibernate.cfg.xml中添加配置信息
<class-cache usage="read-only" class="com.hejian.hibernate.domain.Employee"/>
usage想说明一下,有四个配置:read-only只读,read-write并发读写(推荐),nonstrict-read-write非严格并发读写(造成数据丢失),transactional事物型(缓存也回滚,一般cache不支持这种,因为实现非常复杂,只有jboss支持)
第二种:在映射文件配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hejian.hibernate.domain">
<class name="Employee" table="employee" dynamic-update="true" discriminator-value="0">
<!--
<id name="id" column="id">
<generator class="native"></generator>
</id>
-->
<cache usage="read-write"/>
<!-- use for union-class -->
<id name="id">
<generator class="hilo"></generator>
</id>
<!--
<discriminator column="type" type="int"></discriminator>
-->
<property name="name"></property>
<many-to-one name="depart" column="depart_id" ></many-to-one>
<!-- only one talbe
<subclass name="Skill" discriminator-value="1">
<property name="skill"></property>
</subclass>
<subclass name="Sale" discriminator-value="2">
<property name="sale"></property>
</subclass>
-->
<!--
<joined-subclass name="Skill" table="skill">
<key column="employee_id"></key>
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sale" table="sale">
<key column="employee_id"></key>
<property name="sale"></property>
</joined-subclass>
-->
<!--
<subclass name="Skill" discriminator-value="1">
<property name="skill"></property>
</subclass>
<subclass name="Sale" discriminator-value="2">
<join table="sale">
<key column="employee_id"></key>
<property name="sale"></property>
</join>
</subclass>
-->
<union-subclass name="Skill" table="skill">
<property name="skill"></property>
</union-subclass>
<union-subclass name="Sale" table="sale">
<property name="sale"></property>
</union-subclass>
</class>
</hibernate-mapping>
为了便于调试,可在hibernate.cfg.xml中打开
<property name="generate_statistics">true</property>
之后可在代码中
System.out.println(HibernateUtil.getSessionFactory().getStatistics());
总结:在hibernate3.3.2中使用2级缓存,是可以正常使用,但不知为何
在hibernate4.0.1中同样配置会出现:
Caused by: org.hibernate.cache.NoCachingEnabledException: Second-level cache is not enabled for usage [hibernate.cache.use_second_level_cache | hibernate.cache.use_query_cache]
at org.hibernate.cache.internal.NoCachingRegionFactory.buildEntityRegion(NoCachingRegionFactory.java:68)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:339)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at com.hejian.hibernate.domain.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:18)
... 3 more
求解。
分享到:
相关推荐
【Hibernate缓存实例详解】 在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它极大地简化了数据库操作。为了提高性能,Hibernate引入了缓存机制,分为一级缓存和二级缓存。本篇文章将深入探讨...
二级缓存需要提供并发访问策略以确保事务隔离级别,同时也需要设定数据过期策略,如最大内存数量、存活时间等,以防止缓存数据过时或占用过多资源。二级缓存还可以将超出内存限制的数据写入硬盘,形成持久化的缓存。...
3. 合理设定缓存大小,避免缓存溢出导致系统性能下降。 4. 使用缓存时,应确保有足够的内存资源,防止因缓存过大导致系统内存不足。 总结来说,Hibernate的缓存机制是提升应用性能的重要手段,但正确使用和管理缓存...
【Hibernate缓存管理】 在软件开发中,尤其是涉及到数据库操作时,优化性能是至关重要的,而Hibernate作为一种流行的Java ORM框架,提供了缓存机制来提升数据访问速度。缓存是计算机系统中常用的一种技术,用于存储...
**Hibernate缓存管理详解** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它极大地简化了数据库操作。其中,缓存管理是Hibernate的核心特性之一,对于提高应用程序性能有着显著的作用。本文将深入探讨...
**一、Hibernate缓存层次** Hibernate缓存主要分为一级缓存和二级缓存: 1. **一级缓存(Session级别)**:每个Hibernate Session都拥有自己的缓存,也称为事务级缓存。当对象被持久化时,会自动放入一级缓存,...
标题与描述均提到了“c3p0 Hibernate缓存详细配置”,这暗示了文章将深入探讨如何在使用Hibernate框架时,通过c3p0连接池进行优化和性能提升的细节。c3p0是一个开源的数据库连接池实现,广泛应用于Java环境中,能够...
**一、为何使用Hibernate缓存?** 1. **降低访问频率**:Hibernate频繁地与数据库交互,缓存可以减少这种交互,避免不必要的数据库读写。 2. **提升性能**:从缓存中读取数据比从数据库读取更快,因为内存访问比...
2. **定期清理缓存**:为防止缓存无限增长,应设定合理的缓存清理策略。 3. **缓存粒度**:合理设计缓存的粒度,过细可能导致大量小缓存,过粗可能导致无效的缓存命中。 4. **缓存失效**:对于有实时性要求的数据...
这里,`maxElementsInMemory`限制了内存中缓存的最大对象数量,`eternal`指定了是否永不过期,`timeToLiveSeconds`和`timeToIdleSeconds`分别设定了元素存活时间和空闲时间,`overflowToDisk`表示当内存缓存满时,...
总的来说,配置Memcached作为Hibernate 4的二级缓存是一个多步骤的过程,涉及到库的引入、配置文件的修改、实体类的标注以及缓存策略的设定。这个过程能够显著提高数据访问效率,降低数据库负载,尤其适用于大数据量...
配置完成后,当服务器启动并访问首页时,点击热门商品,由于二级缓存的存在,后台不再执行SQL查询,这是因为默认配置文件`ehcache-failsafe.xml`已经设定了缓存策略。对于session的查询操作,如`get()`和`load()`,...
3. 控制缓存过期时间:可以使用`.setCacheTimeout(600)`设定缓存存活秒数。 六、查询缓存与二级缓存的区别 查询缓存和二级缓存虽然都是用于优化性能,但它们的作用不同。二级缓存存储的是实体对象,而查询缓存则...
例如,设置适当的缓存大小以避免内存溢出,选择合适的缓存替换策略(如LRU、LFU等)以保证常用数据的快速访问,以及设定合理的过期时间以保持数据新鲜度。 总结,Hibernate与Ehcache的整合使用,不仅降低了数据库的...
1. **配置**: 创建`hibernate.cfg.xml`或使用Java配置来设定数据库连接参数、方言、缓存等。 2. **实体类定义**: 编写Java类并添加对应的注解,如`@Entity`、`@Table`、`@Id`等。 3. **映射配置**: 定义实体类与...
2. **配置文件**:在Hibernate中,`hibernate.cfg.xml`是主要的配置文件,用于设定数据库连接信息、实体类映射、缓存策略等。通过解析这个文件,Hibernate能建立起与数据库的连接,并了解如何映射Java类到数据库表。...