`

hibernate优化

阅读更多

session控制
 为了避免session创建的开销,需要对session的创建进行控制
 当前行为:
  使用ThreadLocal的方式控制session的创建
  使用filter的方式创建和关闭session
  尚未配置filter
 
事务控制
    针对hibernate由三种dao操作 find save flush
    find即查询不需要开事务,所以可以考虑针对查询不使用事务控制
    针对saveOrUpdate使用事务
    现在事务提交是在filter结束的时候去做
    但有一些action中是不需要事务的,频繁开关事务可能会带来一定的系统开销
    当前测试使用和不使用事务进行查询测试结果(根据ID查询记录100次时间比较)
        不开事务 421ms
        打开事务 516ms
    事务的开关最好限定在方法内部,可以考虑在service方法中开关事务,可以避免这个问题
    session关闭和事务提交的时候,hibernate会主动调用flush方法进行数据库同步
    所以在当前项目中不需要关心flush方法
事务实现选用和配置
 使用jdbc事务控制
 不选用jta作为事务的实现
  放弃理由
   当前测试服务器tomcat本身仅仅是个web server,并不支持jta   
  配置hibernate属性信息
   hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
              net.sf.hibernate.transaction.JDBCTransactionFactory
  jta的好处
   JTA提供了跨Session的事务管理能力 
   为以后扩展留下了选择空间
  实现
   单一的增删改操作不需要调用session.beginTransaction()等方法
   针对多条记录的修改使用下面的方式调用api
   UserTransaction ut = (UserTransaction)(new InitialContext().lookup("java:comp/UserTransaction"));
   ut.begin();
         //.....
         ut.commit();
          使用下面的方式也可以同样实现事务控制,但因为hibernate内部同样调用上面的api实现
          处于节省资源的想法,不建议使用
   Transaction tx = session.beginTransaction();
   tx.commit();
   以后可以考虑使用spring的aop实现替换当前实现   
  在tomcat中的配置
   <Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction"/>
      <ResourceParams name="UserTransaction">
      <parameter>
    <name>factory</name>
    <value>org.objectweb.jotm.UserTransactionFactory</value>
      </parameter>
      <parameter>
       <name>jotm.timeout</name>
       <value>60</value>
      </parameter>
      </ResourceParams>            
分页控制
 通过criteria. setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围 
延迟加载
 lazy_load
 所有有关数据关联(一对多,多对多等)的映射都需要指定延迟加载
 因为当前系统的session关闭是在filter里面做的,所以不需要控制关联对象的加载
 在特殊的情况下,比如session关闭后获取关联对象
 可以在session关闭前调用Hibernate.initialize()API获取关联对象
  
缓存选用及配置管理
 当前选用EHCache作为第二层的缓存(第一层为数据库缓存)
 由于EHCache不支持分布式,所以将来可以考虑使用jgroup实现分布式
 针对系统内大部分的dao操作使用只读(read)方式进行缓存
 需要写入的部署在不同的机器上解决多个jvm上数据不一致的问题
 
 EHCache配置
  首先配置hibernate缓存provider class属性
   hibernate.cache.provider_class net.sf.ehcache.hibernate.Provider
  配置ehcahe配置文件
   <ehcache>
       <diskStore path="java.io.tmpdir"/>
       <defaultCache
           maxElementsInMemory="10000"   //Cache中最大允许保存的数据数量
           eternal="false"     //Cache中数据是否为常量
           timeToIdleSeconds="120"   //缓存数据钝化时间
           timeToLiveSeconds="120"   //缓存数据的生存时间
           overflowToDisk="true"   //内存不足时,是否启用磁盘缓存
           />
   </ehcache>
  在hibernate映射文件中指定各个映射实体的Cache策略
   <cache usage="read-write"/>
   <cache usage="read-only"/>
 配置好Cache之后,Hibernate在运行期会自动应用Cache机制
 
对于查询方法的选用策略
    Query.list();
        通过一条sql语句返回所有对象
    Query.iterate();
        而iterate方法,则是首先通过一条Select SQL获取所有符合查询条件的记录的id
        再对这个id集合进行循环操作,通过单独的Select SQL取出每个id所对应的记录
        之后填入POJO中返回。
    但list方法不会从缓存中读取数据
    而iterator方法在返回id集合后,针对每一条记录会先到缓存中读取数据

    综合以上,当前系统使用原则
        少量的数据和不频繁访问的数据使用list方法
        频繁访问的数据使用iterator方法
           
数据库连接池配置和管理
 出于通用的原则选用dbcp
 hibernate中的配置
  ###################################
  ### Apache DBCP Connection Pool ###
  ###################################
  
  ## connection pool
  
  #hibernate.dbcp.maxActive 100
  #hibernate.dbcp.whenExhaustedAction 1
  #hibernate.dbcp.maxWait 120000
  #hibernate.dbcp.maxIdle 10
  
  ## prepared statement cache
  
  #hibernate.dbcp.ps.maxActive 100
  #hibernate.dbcp.ps.whenExhaustedAction 1
  #hibernate.dbcp.ps.maxWait 120000
  #hibernate.dbcp.ps.maxIdle 10
  
 其他配置
  hibernate.cache.use_query_cache
  cache.use_minimal_puts false
  
其他问题
 当获取大量关联数据的时候,需要指定关联集合属性 (解决N+1 Select问题)
  batch-size (可选,默认是1) 指定一个用于根据标识符抓取实例时使用的"batch size"(批次抓取数量)
  可设置为10
 对于一些统计查询,尽可能使用hql,而不要依赖于映射进行获取
 对于代码级别的特殊查询,通过设置FetchMode提高效率
 使用绑定变量
     在查询中,使用占位符号: 替换非常量值,在查询中使用命名参数
     因为query是可以缓存的,所以使用命名参数的方式可以提升查询效率

分享到:
评论

相关推荐

    hibernate 优化

    《Hibernate优化深度解析》 在Java企业级开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着项目的规模扩大,如何进行有效的Hibernate优化,提升系统的性能,成为了...

    Hibernate优化

    《Hibernate优化深度解析》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着项目规模的扩大,如果不进行适当的优化,Hibernate可能会成为性能瓶颈。本文将深入...

    hibernate优化前的程序

    在探讨Hibernate优化前的程序之前,我们先要理解Hibernate的核心概念和它的工作原理。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,从而减轻了数据库编程的复杂...

    hibernate 优化方案

    ### Hibernate优化方案详解 在企业级应用开发中,Hibernate作为一款优秀的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,在处理大量数据或复杂查询时,Hibernate的性能问题逐渐凸显。本文将深入探讨...

    Hibernate优化方案

    【Hibernate优化方案】 在开发Java应用时,Hibernate作为流行的ORM框架,其性能优化至关重要。本文主要探讨了在Hibernate中如何优化数据操作,包括批量修改和删除、使用SQL执行批量操作以及提升数据库查询性能。 ...

    hibernate代码优化基于配置的多表查询

    本文将深入探讨如何通过配置优化Hibernate的多表查询,以提高应用的性能。 1. **联合查询优化**: 在进行多表查询时,Hibernate默认可能会生成多个单表查询,这会导致大量的数据库往返,降低效率。通过配置`@Join...

    一次hibernate的优化实践

    Hibernate优化并非一次性任务,而是需要持续关注和调整的过程。理解其工作原理,结合业务场景,才能更好地发挥Hibernate的优势,同时避免潜在的性能问题。通过这次优化实践,我们不仅提升了系统性能,也积累了宝贵的...

    Hibernate实战

    懒加载是Hibernate优化性能的一种策略,它延迟加载关联的对象,直到真正需要时才执行数据库查询。缓存机制可以提高数据访问速度,减少数据库负载,包括一级缓存(Session级)和二级缓存(SessionFactory级)。性能...

    hibernate4.5.1

    这个版本的Hibernate优化了实体管理工厂(EntityManagerFactory)和实体管理器(EntityManager)的性能,提升了数据持久化的效率。 接下来,我们关注一下压缩包中的"hibernate-search-4.5.1.Final"。Hibernate ...

    hibernate面试题2

    10. **Hibernate优化**: - **双向一对多关联**:减少N+1选择问题。 - **批处理**:批量操作提高性能。 - **合理使用缓存**:根据需求选择合适的缓存策略。 - **避免过多的JOIN操作**:减少数据库交互。 - **...

    spring mvc + spring + hibernate 全注解整合开发视频教程 11

    在观看11.mp4时,你可能会看到如何处理复杂业务逻辑的示例,如何解决实际开发中的问题,或者如何优化和调试整合后的应用。确保跟随教程逐步操作,并尝试理解和消化每个概念,这样将有助于你在实际项目中应用这些技术...

    Hibernate性能优化

    《Hibernate性能优化》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,性能问题逐渐显现,因此对Hibernate进行性能优化变得至关重要。本篇...

    hibernate源码

    9. **懒加载和立即加载**:懒加载策略是Hibernate优化性能的重要手段,它延迟到对象真正被使用时才加载关联的数据。立即加载则是在获取主对象时立即加载关联对象。 10. **实体状态管理**:Hibernate管理对象的四种...

    hibernate 源码直接导入Eclipse

    5. Hibernate优化技巧: - 第二级缓存:通过引入缓存插件(如 EhCache),提高数据访问性能。 - 异步批处理:使用批处理更新和查询,减少数据库交互次数。 - 动态加载策略:选择合适的懒加载和立即加载策略,避免...

Global site tag (gtag.js) - Google Analytics