`

Hibernate缓存的一些设定

 
阅读更多

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

求解。

 

 

0
1
分享到:
评论

相关推荐

    Hibernate 缓存 实例

    【Hibernate缓存实例详解】 在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它极大地简化了数据库操作。为了提高性能,Hibernate引入了缓存机制,分为一级缓存和二级缓存。本篇文章将深入探讨...

    hibernate的一级缓存和二级缓存

    二级缓存需要提供并发访问策略以确保事务隔离级别,同时也需要设定数据过期策略,如最大内存数量、存活时间等,以防止缓存数据过时或占用过多资源。二级缓存还可以将超出内存限制的数据写入硬盘,形成持久化的缓存。...

    hibernate的缓存机制

    3. 合理设定缓存大小,避免缓存溢出导致系统性能下降。 4. 使用缓存时,应确保有足够的内存资源,防止因缓存过大导致系统内存不足。 总结来说,Hibernate的缓存机制是提升应用性能的重要手段,但正确使用和管理缓存...

    Hibernate缓存管理[参照].pdf

    【Hibernate缓存管理】 在软件开发中,尤其是涉及到数据库操作时,优化性能是至关重要的,而Hibernate作为一种流行的Java ORM框架,提供了缓存机制来提升数据访问速度。缓存是计算机系统中常用的一种技术,用于存储...

    Hibernate 缓存管理

    **Hibernate缓存管理详解** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它极大地简化了数据库操作。其中,缓存管理是Hibernate的核心特性之一,对于提高应用程序性能有着显著的作用。本文将深入探讨...

    Hibernate二级缓存

    **一、Hibernate缓存层次** Hibernate缓存主要分为一级缓存和二级缓存: 1. **一级缓存(Session级别)**:每个Hibernate Session都拥有自己的缓存,也称为事务级缓存。当对象被持久化时,会自动放入一级缓存,...

    c3p0 hibernate缓存详细配置

    标题与描述均提到了“c3p0 Hibernate缓存详细配置”,这暗示了文章将深入探讨如何在使用Hibernate框架时,通过c3p0连接池进行优化和性能提升的细节。c3p0是一个开源的数据库连接池实现,广泛应用于Java环境中,能够...

    Java框架篇—hibernate之缓存机制_.docx

    **一、为何使用Hibernate缓存?** 1. **降低访问频率**:Hibernate频繁地与数据库交互,缓存可以减少这种交互,避免不必要的数据库读写。 2. **提升性能**:从缓存中读取数据比从数据库读取更快,因为内存访问比...

    hibernate二级缓存

    2. **定期清理缓存**:为防止缓存无限增长,应设定合理的缓存清理策略。 3. **缓存粒度**:合理设计缓存的粒度,过细可能导致大量小缓存,过粗可能导致无效的缓存命中。 4. **缓存失效**:对于有实时性要求的数据...

    hibernate对二级缓存的理解

    这里,`maxElementsInMemory`限制了内存中缓存的最大对象数量,`eternal`指定了是否永不过期,`timeToLiveSeconds`和`timeToIdleSeconds`分别设定了元素存活时间和空闲时间,`overflowToDisk`表示当内存缓存满时,...

    配置memecached作hibernate4的二级缓存

    总的来说,配置Memcached作为Hibernate 4的二级缓存是一个多步骤的过程,涉及到库的引入、配置文件的修改、实体类的标注以及缓存策略的设定。这个过程能够显著提高数据访问效率,降低数据库负载,尤其适用于大数据量...

    SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示

    配置完成后,当服务器启动并访问首页时,点击热门商品,由于二级缓存的存在,后台不再执行SQL查询,这是因为默认配置文件`ehcache-failsafe.xml`已经设定了缓存策略。对于session的查询操作,如`get()`和`load()`,...

    hibernate查询缓存详细分析

    3. 控制缓存过期时间:可以使用`.setCacheTimeout(600)`设定缓存存活秒数。 六、查询缓存与二级缓存的区别 查询缓存和二级缓存虽然都是用于优化性能,但它们的作用不同。二级缓存存储的是实体对象,而查询缓存则...

    hibernate+ehcache jar包

    例如,设置适当的缓存大小以避免内存溢出,选择合适的缓存替换策略(如LRU、LFU等)以保证常用数据的快速访问,以及设定合理的过期时间以保持数据新鲜度。 总结,Hibernate与Ehcache的整合使用,不仅降低了数据库的...

    hibernate最新版jar包(全)

    1. **配置**: 创建`hibernate.cfg.xml`或使用Java配置来设定数据库连接参数、方言、缓存等。 2. **实体类定义**: 编写Java类并添加对应的注解,如`@Entity`、`@Table`、`@Id`等。 3. **映射配置**: 定义实体类与...

    hibernate-3.5.6 源码

    2. **配置文件**:在Hibernate中,`hibernate.cfg.xml`是主要的配置文件,用于设定数据库连接信息、实体类映射、缓存策略等。通过解析这个文件,Hibernate能建立起与数据库的连接,并了解如何映射Java类到数据库表。...

Global site tag (gtag.js) - Google Analytics