`
ytm
  • 浏览: 13525 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate(性能操作) (转载)

 
阅读更多

在ORM中缓存尤为重要

 

session一级缓存中以键值对存放好的ID是键值是对象

session.evct(id)//清除指定的对象

session.clear();//清除所有的缓存。

 

二级缓存

例子:

 

在hibernate.cfg.xml中注册缓存

 

 

<property name="hibernate.cache.EhCacheProvider">true</property>  
  1.         <property name="cache.provider_class">  
  2.             org.hibernate.cache.EhCacheProvider  
  3.         </property>  
  4.         <property name="hibernate.cache.use_query_cache">true</property>  

 

 

 

在hibernate.cfg.xm同级目录下新建ehcache.xml

 

 

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <ehcache>  
  3.     <diskStore path="d:/cache" />  
  4.     <defaultCache maxElementsInMemory="1000" eternal="false"  
  5.         overflowToDisk="true" timeToIdleSeconds="180" timeToLiveSeconds="300"  
  6.         diskPersistent="false" diskExpiryThreadIntervalSeconds="120" />  
  7.       
  8.     <cache name="longTime" maxElementsInMemory="100" eternal="false"  
  9.         overflowToDisk="true" timeToIdleSeconds="1800"  
  10.         timeToLiveSeconds="3000" diskPersistent="false"  
  11.         diskExpiryThreadIntervalSeconds="120" />  
  12.     <cache name="shortTime" maxElementsInMemory="100" eternal="false"  
  13.         overflowToDisk="true" timeToIdleSeconds="18" timeToLiveSeconds="30"  
  14.         diskPersistent="false" diskExpiryThreadIntervalSeconds="120" />  
  15. </ehcache>  

 

 

 

 

maxElementsInMemory:共存放多少对象

 

overflowToDisk="true" :将益处的缓存存放在硬盘上

diskStore path="d:/cache" /这就是要存放的地址

timeToIdleSeconds="180"//设置空闲时间

timeToLiveSeconds="300"//设置生命时间

 

<class-cache class="com.lovo.po.UserPO" region="shortTime" usage="read-write"/>

 

这个就是哪个类要作读写的是时候触发缓存。

 

 

Hibernate获取数据方式与缓存使用

 

 

 Hibernate获取数据的方式有不同的几种,其与缓存结合使用的效果也不尽相同,而Hibernate中具体怎么使用缓存其实是我们很关心的一个问题,直接涉及到性能方面。

    缓存在Hibernate中主要有三个方面:一级缓存、二级缓存和查询缓存;一级缓存在Hibernate中对应的即为session范围的缓存,也就是当session关闭时缓存即被清除,一级缓存在Hibernate中是不可配置的部分;二级缓存在Hibernate中对应的即为SessionFactory范围的缓存,通常来讲SessionFactory的生命周期和应用的生命周期相同,所以可以看成是进程缓存或集群缓存,二级缓存在Hibernate中是可以配置的,可以通过class-cache配置类粒度级别的缓存(class-cache在class中数据发生任何变化的情况下自动更新),同时也可通过collection-cache配置集合粒度级别的缓存(collection-cache仅在collection中增加了元素或者删除了元素的情况下才自动更新,也就是当collection中元素发生值的变化的情况下它是不会自动更新的),缓存自然会带来并发的访问问题,这个时候相应的就要根据应用来设置缓存所采用的事务隔离级别,和数据库的事务隔离级别概念基本一样,没什么多介绍的,^_^;查询缓存在Hibernate同样是可配置的,默认是关闭的,可以通过设置cache.use_ query_cache为true来打开查询缓存。根据缓存的通常实现策略,我们可以来理解Hibernate的这三种缓存,缓存的实现通过是通过key/value的Map方式来实现,在Hibernate的一级、二级和查询缓存也同样如此,一级、二级缓存使用的key均为po的主键ID,value即为po实例对象,查询缓存使用的则为查询的条件、查询的参数、查询的页数,value有两种情况,如果采用的是select po.property这样的方式那么value为整个结果集,如采用的是from这样的方式那么value为获取的结果集中各po对象的主键ID,这样的作用很明显,节省内存,^_^
简单介绍完Hibernate的缓存后,再结合Hibernate的获取数据方式来说明缓存的具体使用方式,在Hibernate中获取数据常用的方式主要有四种:Session.load、Session.get、Query.list、Query.iterator。

1、Session.load
      在执行session.load时,Hibernate首先从当前session的一级缓存中获取id对应的值,在获取不到的情况下,将根据该对象是否配置了二级缓存来做相应的处理,如配置了二级缓存,则从二级缓存中获取id对应的值,如仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行,如未配置延迟加载则从数据库中直接获取,在从数据库获取到数据的情况下,Hibernate会相应的填充一级缓存和二级缓存,如配置了延迟加载则直接返回一个代理类,只有在触发代理类的调用时才进行数据库查询的操作。
      在这样的情况下我们就可以看到,在session一直打开的情况下,要注意在适当的时候对一级缓存进行刷新操作,通常是在该对象具有单向关联维护的时候,在Hibernate中可以使用象session.clear、session.evict的方式来强制刷新一级缓存。
      二级缓存则在数据发生任何变化(新增、更新、删除)的情况下都会自动的被更新。
2、Session.get
      在执行Session.get时,和Session.load不同的就是在当从缓存中获取不到时,直接从数据库中获取id对应的值。

3、Query.list
      在执行Query.list时,Hibernate的做法是首先检查是否配置了查询缓存,如配置了则从查询缓存中查找key为查询语句+查询参数+分页条件的值,如获取不到则从数据库中进行获取,从数据库获取到后Hibernate将会相应的填充一级、二级和查询缓存,如获取到的为直接的结果集,则直接返回,如获取到的为一堆id的值,则再根据id获取相应的值(Session.load),最后形成结果集返回,可以看到,在这样的情况下,list也是有可能造成N次的查询的。
      查询缓存在数据发生任何变化的情况下都会被自动的清空。

4、Query.iterator
      在执行Query.iterator时,和Query.list的不同的在于从数据库获取的处理上,Query.iterator向数据库发起的是select id from这样的语句,也就是它是先获取符合查询条件的id,之后在进行iterator.next调用时才再次发起session.load的调用获取实际的数据。
      可见,在拥有二级缓存并且查询参数多变的情况下,Query.iterator会比Query.list更为高效。

这四种获取数据的方式都各有适用的场合,要根据实际情况做相应的决定,^_^,最好的方式无疑就是打开show_sql选项看看执行的情况来做分析,系统结构上只用保证这种调整是容易实现的就好了,在cache这个方面的调整自然是非常的容易,只需要调整配置文件里的设置,而查询的方式则可对外部进行屏蔽,这样要根据实际情况调整也非常容易。

分享到:
评论

相关推荐

    Hibernate缓存机制,转载

    **标题:“Hibernate缓存机制,转载”** **描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:*...

    jdbc与hibernate的优缺点比较(转载的精髓).pdf

    综上所述,JDBC更适合于对性能要求高且数据库操作相对简单的场景,而Hibernate则适用于需要快速开发、对象关系映射和事务管理的复杂应用。在选择使用哪种技术时,需要根据项目需求、团队技能和性能要求来平衡。在...

    jsr168 portlet(struts2+spring2.5+hibernate3.3)(转载)

    Hibernate 3.3版本引入了对JPA的支持、增强了性能和查询能力。 这个项目可能是为了展示如何在portlet环境下,使用Struts2处理前端请求,Spring管理业务逻辑和依赖,以及Hibernate处理数据库操作。开发者可能通过...

    MyEclipse6Java开发中文教程

    在后续章节中,读者会学习到如何创建和管理Java项目,使用MyEclipse的代码编辑、调试和测试功能,以及如何利用Struts 2进行控制器的设定,Spring 2进行依赖注入,和Hibernate 3进行数据持久化操作。此外,可能还会...

    数据模型设计心得(转载)

    **源码**标签可能意味着文章中会提及如何将数据模型转化为实际的编程代码,比如SQL语句或者ORM框架(如Hibernate、MyBatis)的映射配置。源码层面的数据模型设计需要考虑性能、可维护性和扩展性。 **工具**标签可能...

    JBPM的开发指南,转载过来的

    JBPM提供了一系列API和工具,如KieServices用于交互式操作,KieSession处理流程实例的生命周期,而JbpmConsole则是一个Web界面,方便流程管理和监控。 ### 5. **扩展与集成** JBPM可与Spring、Hibernate等框架集成...

    Java 最常见 200+ 面试题全解析:面试必备.pdf

    12. Hibernate:作为Java对象关系映射工具,Hibernate简化了数据持久化的复杂性,主要探讨其核心概念和使用方法。 13. MyBatis:讨论MyBatis框架的特点,以及如何进行SQL语句映射和结果集处理。 14. RabbitMQ:是...

    Java面试题

    对于【JAVA面试常被问到的题目[转载+解答] - Moon Face - 博客园.png】这个文件,通常它可能包含了一篇博客文章的截图,其中详细解答了一些Java面试题。如果能够查看这个文件,你将得到更具体的答案和解析,帮助你在...

    j2ee在线购物网实例源码

    4. **Hibernate**:作为ORM(对象关系映射)工具,用于数据库操作,将Java对象与SQL数据库表进行映射。 5. **EJB(Enterprise JavaBeans)**:在J2EE环境中处理业务逻辑的组件,虽然现代项目更倾向于使用轻量级框架...

    DWR中文文档v0.9

    ### DWR中文文档v0.9 - DWR2.0 版本介绍 ...它不仅覆盖了DWR的基本概念和技术细节,还涉及到了如何将其与其他流行框架进行整合,非常适合那些希望通过DWR提高Web应用程序性能和用户体验的开发者们。

    springmybatis

    性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这...

Global site tag (gtag.js) - Google Analytics