hibernate优化:Hibernate优化思路方法解析

  Hibernate优化思路方法:批量修改和删除

  在Hibernate 2中如果需要对任何数据进行修改和删除操作都需要先执行查询操作在得到要修改或者删除数据后再对该数据进行相应操作处理在数据量少情况下采用这种处理方式没有问题但需要处理大量数据时候就可能存在以下问题:

  ◆占用大量内存

  ◆需要多次执行update/delete语句而每次执行只能处理条数据

  以上两个问题出现会严重影响系统性能因此在Hibernate 3中引入了用于批量更新或者删除数据HQL语句这样开发人员就可以次更新或者删除多条记录而不用每次都个地修改或者删除记录了

  如果要删除所有User对象(也就是User对象所对应表中记录)则可以直接使用下面HQL语句:

  delete User

  而在执行这个HQL语句时需要Query对象executeUpdate思路方法具体例子如下所示:

  String HQL="delete User";

  Query query=session.createQuery(HQL);

   size=query.executeUpdate;

  采用这种方式进行数据修改和删除时和直接使用JDBC方式在性能上相差无几是推荐使用正确思路方法

  如果不能采用HQL语句进行大量数据修改也就是说只能使用取出再修改方式时也会遇到批量插入时内存溢出问题所以也要采用上面所提供处理思路方法来进行类似处理

  Hibernate优化思路方法 2:使用SQL执行批量操作

  在进行批量插入、修改和删除操作时直接使用JDBC来执行原生态SQL语句无疑会获得最佳性能这是在处理过程中省略或者简化了以下处理内容:

  ● HQL语句到SQL语句转换

  ● Java对象

  ● Java对象缓存Cache处理

  但是在直接使用JDBC执行SQL语句时个最重要问题就是要处理缓存Cache中Java对象通过这种底层方式对数据修改将不能通知缓存Cache去进行相应更新操作以保证缓存Cache中对象和数据库中数据是

  Hibernate优化思路方法 3:提升数据库查询性能

  数据库查询性能提升也是涉及到开发中各个阶段在开发中选用正确查询思路方法无疑是最基础也最简单

  1 、SQL语句优化

  使用正确SQL语句可以在很大程度上提高系统查询性能获得同样数据而采用区别方式SQL语句在性能上差距可能是十分巨大

  由于Hibernate是对JDBC封装SQL语句产生都是动态由Hibernate自动完成Hibernate产生SQL语句方式有两种:种是通过开发人员编写HQL语句来生成种是依据开发人员对关联对象访问来自动生成相应SQL语句

  至于使用什么样SQL语句可以获得更好性能要依据数据库结构以及所要获取数据具体情况来进行处理在确定了所要执行SQL语句后可以通过以下 3个方面来影响Hibernate所生成SQL语句:

  ◆HQL语句书写思路方法

  ◆查询时所使用查询思路方法

  ◆对象关联时所使用抓取策略

  2 、使用正确查询思路方法

  在前面已经介绍过执行数据查询功能基本思路方法有两种:种是得到单个持久化对象get思路方法和load思路方法种是Query对象list思路方法和iterator思路方法在开发中应该依据区别情况选用正确思路方法

  get思路方法和load思路方法区别在于对 2级缓存Cache使用上load思路方法会使用 2级缓存Cache而get思路方法在级缓存Cache没有找到情况下会直接查询数据库不会去 2级缓存Cache中查找在使用中对使用了 2级缓存Cache对象进行查询时最好使用load思路方法以充分利用 2级缓存Cache来提高检索效率

  list思路方法和iterator思路方法的间区别可以从以下几个方面来进行比较

  ◆执行查询区别

  list思路方法在执行时是直接运行查询结果所需要查询语句而iterator思路方法则是先执行得到对象ID查询然后再根据每个ID值去取得所要查询对象因此对于list方式查询通常只会执行个SQL语句而对于iterator思路方法查询则可能需要执行N+1条SQL语句(N为结果集中记录数)

  iterator思路方法只是可能执行N+1条数据具体执行SQL语句数量取决于缓存Cache情况以及对结果集访问情况

  ◆缓存Cache使用

  list思路方法只能使用 2级缓存Cache中查询缓存Cache而无法使用 2级缓存Cache对单个对象缓存Cache(但是会把查询出对象放入 2级缓存Cache中)所以除非重复执行相同查询操作否则无法利用缓存Cache机制来提高查询效率

  iterator思路方法则可以充分利用 2级缓存Cache在根据ID检索对象时候会首先到缓存Cache中查找只有在找不到情况下才会执行相应查询语句所以缓存Cache中对象存在和否会影响到SQL语句执行数量

  ◆对于结果集处理思路方法区别

  list思路方法会次获得所有结果集对象而且它会依据查询结果化所有结果集对象这在结果集非常大时候必然会占据非常多内存甚至会造成内存溢出情况发生

  iterator思路方法在执行时不会化所有对象而是根据对结果集访问情况来化对象因此在访问中可以控制缓存Cache中对象数量以避免占用过多缓存Cache导致内存溢出情况发生使用iterator思路方法另外个好处是如果只需要结果集中部分记录那么没有被用到结果对象根本不会被所以对结果集访问情况也是iterator思路方法时执行数据库SQL语句多少个原因

  所以在使用Query对象执行数据查询时应该从以上几个方面去考虑使用何种思路方法来执行数据库查询操作

  Hibernate优化思路方法 4:使用正确抓取策略

  所谓抓取策略(fetching strategy)是指当应用需要利用关联关系进行对象获取时候Hibernate获取关联对象策略抓取策略可以在O/R映射元数据中声明也可以在特定HQL或条件查询中声明

  Hibernate 3定义了以下几种抓取策略

  连接抓取(Join fetching)

  连接抓取是指Hibernate在获得关联对象时会在SELECT语句中使用外连接方式来获得关联对象

  查询抓取(Select fetching)

  查询抓取是指Hibernate通过另外条SELECT语句来抓取当前对象关联对象方式这也是通过外键方式来执行数据库查询和连接抓取区别在于通常情况下这个SELECT语句不是立即执行而是在访问到关联对象时候才会执行

  子查询抓取(Subselect fetching)

  子查询抓取也是指Hibernate通过另外条SELECT语句来抓取当前对象关联对象方式和查询抓取区别在于它所采用SELECT语句方式为子查询而不是通过外连接

  批量抓取(Batch fetching)

  批量抓取是对查询抓取优化它会依据主键或者外键列表来通过单条SELECT语句实现管理对象批量抓取

  以上介绍是Hibernate 3所提供抓取策略也就是抓取关联对象手段为了提升系统性能在抓取关联对象时机上还有以下些选择

  立即抓取(Immediate fetching)

  立即抓取是指宿主对象被加载时它所关联对象也会被立即加载

  延迟集合抓取(Lazy collection fetching)

  延迟集合抓取是指在加载宿主对象时并不立即加载它所关联对象而是到应用访问关联对象时候才抓取关联对象这是集合关联对象默认行为

  延迟代理抓取(Lazy proxy fetching)

  延迟代理抓取是指在返回单值关联对象情况下并不在对其进行get操作时抓取而是直到其某个思路方法时候才会抓取这个对象

  延迟属性加载(Lazy attribute fetching)

  延迟属性加载是指在关联对象被访问时候才进行关联对象抓取

  介绍了Hibernate所提供关联对象抓取思路方法和抓取时机这两个方面原因都会影响Hibernate抓取行为最重要是要清楚这两方面影响是区别不要将这两个原因混淆在开发中要结合实际情况选用正确抓取策略和合适抓取时机

  ◆抓取时机选择

  在Hibernate 3中对于集合类型关联在默认情况下会使用延迟集合加载抓取时机而对于返回单值类型关联在默认情况下会使用延迟代理抓取抓取时机

  对于立即抓取在开发中很少被用到这很可能会造成不必要数据库操作从而影响系统性能当宿主对象和关联对象总是被同时访问时候才有可能会用到这种抓取时机另外使用立即连接抓取可以通过外连接来减少查询SQL语句数量所以也会在某些特殊情况下使用

  然而延迟加载又会面临另外个问题如果在Session关闭前关联对象没有被例子化那么在访问关联对象时候就会抛出异常处理思路方法就是在事务提交的前就完成对关联对象访问

  所以在通常情况下都会使用延迟方式来抓取关联对象每个立即抓取都会导致关联对象立即例子化太多立即抓取关联会导致大量对象被例子化从而占用过多内存资源

  ◆抓取策略选取

  对于抓取策略选取将影响到抓取关联对象方式也就是抓取关联对象时所执行SQL语句这就要根据实际业务需求、数据数量以及数据库结构来进行选择了



  在这里需要注意通常情况下都会在执行查询时候针对每个查询来指定对其合适抓取策略指定抓取策略思路方法如下所示:

  User user = (User) session.createCriteria(User.)

  .FetchMode("permissions", FetchMode.JOIN)

  .add( Restrictions.idEq(userId) )

  .uniqueResult;

  Hibernate优化思路方法 5:查询性能提升小结

  在本小节中介绍了查询性能提升思路方法关键是如何通过优化SQL语句来提升系统查询性能查询思路方法和抓取策略影响也是通过执行查询方式和SQL语句多少来改变系统性能这些都属于开发人员所应该掌握基本技能避免由于开发不当而导致系统性能低下

  在性能调整中除了前面介绍执行SQL语句原因外对于缓存Cache使用也会影响系统性能通常来说缓存Cache使用会增加系统查询性能而降低系统增加、修改和删除操作性能(要进行缓存Cache同步处理)所以开发人员应该能够正确地使用有效缓存Cache来提高数据查询性能而要避免滥用缓存Cache而导致系统性能变低在采用缓存Cache时候也应该注意调整自己检索策略和查询思路方法这 3者配合起来才可以达到最优性能

  另外事务使用策略也会影响到系统性能选取正确事务隔离级别以及使用



Tags:  hibernate查询优化 hibernate的优化 hibernate性能优化 hibernate优化

延伸阅读

最新评论

发表评论