??xml version="1.0" encoding="utf-8" standalone="yes"?>久久午夜免费电影,久久精品这里都是精品,欧美一级黄色大片http://www.aygfsteel.com/day/category/20646.htmlzh-cnFri, 16 Mar 2007 09:13:21 GMTFri, 16 Mar 2007 09:13:21 GMT60HibernateE序性能优化的考虑要点(转脓) http://www.aygfsteel.com/day/archive/2007/03/14/103869.htmldatydatyWed, 14 Mar 2007 11:43:00 GMThttp://www.aygfsteel.com/day/archive/2007/03/14/103869.htmlhttp://www.aygfsteel.com/day/comments/103869.htmlhttp://www.aygfsteel.com/day/archive/2007/03/14/103869.html#Feedback0http://www.aygfsteel.com/day/comments/commentRss/103869.htmlhttp://www.aygfsteel.com/day/services/trackbacks/103869.htmlhttp://www.aygfsteel.com/chunkyo/archive/2007/03/05/101894.html

本文依照HIBERNATE帮助文档Q一些网l书c及目l验整理而成Q只提供要点和思\Q具体做法可以留a探讨Q或是找一些更详细更有针对性的资料?

  初用HIBERNATE的h也许都遇到过性能问题Q实现同一功能Q用HIBERNATE与用JDBC性能相差十几倍很正常Q如果不及早调整Q很可能影响整个目的进度?/p>

  大体上,对于HIBERNATE性能调优的主要考虑点如?

  Ø 数据库设计调?/p>

  Ø HQL优化

  Ø API的正?如根据不同的业务cd选用不同的集合及查询API)

  Ø 主配|参?日志Q查询缓存,fetch_size, batch_size{?

  Ø 映射文g优化(ID生成{略Q二U缓存,延迟加蝲Q关联优?

  Ø 一U缓存的理

  Ø 针对二~存Q还有许多特有的{略

  Ø 事务控制{略?/p>

  1?数据库设?/p>

  a) 降低兌的复杂?/p>

  b) 量不用联合主?/p>

  c) ID的生成机Ӟ不同的数据库所提供的机制ƈ不完全一?/p>

  d) 适当的冗余数据,不过分追求高范式

  2?HQL优化

  HQL如果抛开它同HIBERNATE本n一些缓存机制的兌QHQL的优化技巧同普通的SQL优化技巧一P可以很容易在|上扑ֈ一些经验之谈?/p>

  3?主配|?/p>

  a) 查询~存Q同下面讲的~存不太一P它是针对HQL语句的缓存,卛_全一L语句再次执行时可以利用缓存数据。但是,查询~存在一个交易系l?数据变更频繁Q查询条件相同的机率q不?中可能会起反作用:它会白白耗费大量的系l资源但却难以派上用场?/p>

  b) fetch_sizeQ同JDBC的相兛_C用类|参数q不是越大越好,而应Ҏ业务特征去设|?/p>

  c) batch_size同上?/p>

  d) 生pȝ中,切记要关掉SQL语句打印?/p>

  4?~存

  a) 数据库~存:q~存是最高效和安全的Q但不同的数据库可管理的层次q不一P比如Q在ORACLE中,可以在徏表时指定整个表|于~存当中?/p>

  b) SESSION~存:在一个HIBERNATE SESSION有效Q这U缓存的可干预性不强,大多于HIBERNATE自动理Q但它提供清除缓存的ҎQ这在大扚w增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OutofMemeroy的异常,q时可能需要手动清除这一U缓?Session.evict以及Session.clear

  c) 应用~存:在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此Q各cȝ略也考虑的较多,在将数据攑օq一U缓存之前,需要考虑一些前提条?

  i. 数据不会被第三方修改(比如Q是否有另一个应用也在修改这些数?)

  ii. 数据不会太大

  iii. 数据不会频繁更新(否则使用CACHE可能适得其反)

  iv. 数据会被频繁查询

  v. 数据不是关键数据(如涉及钱Q安全等斚w的问??/p>

  ~存有几UŞ式,可以在映文件中配置:read-only(只读Q适用于很变更的静态数?历史数据)Qnonstrict-read-writeQread-write(比较普遍的Ş式,效率一?Qtransactional(JTA中,且支持的~存产品较少)

  d) 分布式缓?同c)的配|一P只是~存产品的选用不同Q在目前的HIBERNATE中可供选择的不多,oscache, jboss cacheQ目前的大多数项目,对它们的用于集群的?特别是关键交易系l?都持保守态度。在集群环境中,只利用数据库U的~存是最安全的?/p>

  5?延迟加蝲

  a) 实体延迟加蝲:通过使用动态代理实?/p>

  b) 集合延迟加蝲:通过实现自有的SET/LISTQHIBERNATE提供了这斚w的支?/p>

  c) 属性gq加?

  6?Ҏ选用

  a) 完成同样一件事QHIBERNATE提供了可供选择的一些方式,但具体用什么方式,可能用性能/代码都会有媄响。显C,一ơ返回十万条记录(List/Set/Bag/Map{?q行处理Q很可能D内存不够的问题,而如果用Z游标(ScrollableResults)或Iterator的结果集Q则不存在这L问题?/p>

  b) Session的load/getҎQ前者会使用二~存Q而后者则不用?/p>

  c) Query和list/iteratorQ如果去仔细研究一下它们,你可能会发现很多有意思的情况Q二者主要区?如果使用了SpringQ在HibernateTemplate中对应find,iteratorҎ):

  i. list只能利用查询~存(但在交易pȝ中查询缓存作用不?Q无法利用二U缓存中的单个实体,但list查出的对象会写入二~存Q但它一般只生成较少的执行SQL语句Q很多情况就是一?无关??/p>

  ii. iterator则可以利用二U缓存,对于一条查询语句,它会先从数据库中扑և所有符合条件的记录的IDQ再通过IDȝ存找Q对于缓存中没有的记录,再构造语句从数据库中查出Q因此很Ҏ知道Q如果缓存中没有MW合条g的记录,使用iterator会生N+1条SQL语句(N为符合条件的记录?

  iii. 通过iteratorQ配合缓存管理APIQ在量数据查询中可以很好的解决内存问题Q如:

  while(it.hasNext()){

  YouObject object = (YouObject)it.next();

  session.evict(youObject);

  sessionFactory.evice(YouObject.class, youObject.getId());

  }

  如果用listҎQ很可能出OutofMemory错误了?/p>

  iv. 通过上面的说明,我想你应该知道如何去使用q两个方法了?/p>

  7?集合的选用

  在HIBERNATE 3.1文档的?9.5. Understanding Collection performance”中有详l的说明?/p>

  8?事务控制

  事务斚wҎ能有媄响的主要包括:事务方式的选用Q事务隔ȝ别以及锁的选用

  a) 事务方式选用:如果不涉及多个事务管理器事务的话Q不需要用JTAQ只有JDBC的事务控制就可以?/p>

  b) 事务隔离U别:参见标准的SQL事务隔离U别

  c) 锁的选用:悲观?一般由具体的事务管理器实现)Q对于长事务效率低,但安全。乐观锁(一般在应用U别实现)Q如在HIBERNATE中可以定义VERSION字段Q显Ӟ如果有多个应用操作数据,且这些应用不是用同一U乐观锁机制Q则乐观锁会失效。因此,针对不同的数据应有不同的{略Q同前面许多情况一P很多时候我们是在效率与安全/准确性上找一个^衡点Q无论如何,优化都不是一个纯技术的问题Q你应该对你的应用和业务特征有够的了解?/p>

  9?扚w操作

  即是用JDBCQ在q行大批数据更新ӞBATCH与不使用BATCH有效率上也有很大的差别。我们可以通过讄batch_size来让其支持批量操作?/p>

  举个例子Q要扚w删除某表中的对象Q如“delete Account”,打出来的语句Q会发现HIBERNATE扑և了所有ACCOUNT的IDQ再q行删除Q这主要是ؓ了维护二U缓存,q样效率肯定高不了,在后l的版本中增加了bulk delete/updateQ但q也无法解决~存的维护问题。也是_׃有了二~存的维护问题,HIBERNATE的批量操作效率ƈ不尽如h?

  从前面许多要点可以看出,很多时候我们是在效率与安全/准确性上找一个^衡点Q无论如何,优化都不是一个纯技术的问题Q你应该对你的应用和业务特征有够的了解Q一般的Q优化方案应在架构设计期基本确定,否则可能D没必要的q工Q致佉K目g期,而作为架构师和项目经理,q要面对开发h员可能的抱怨,必竟Q我们对用户需求更改的控制力不大,但技?架构风险是应该在初期意识到ƈ制定好相关的对策?/p>

  q有一点要注意Q应用层的缓存只是锦上添花,永远不要把它当救命稻草,应用的根?数据库设计,法Q高效的操作语句Q恰当API的选择{?才是最重要的?/p>

daty 2007-03-14 19:43 发表评论
]]>
վ֩ģ壺 | | | | ܿ| | Ҷ| | ɳ| | ̨| ߴ| | | | ׯ| | | | ˮ| «Ϫ| ƽ| | | Т| Ž| | ½| | | | | | | | | | | ͷ| ϳ| |