Hibernate 性能优化 -- 第一部分

 大体上:对于Hibernate的性能调优主要考虑如下:

1.数据库设计

  • 降低级联的负责性.
  • 尽量不要使用联合主键.
  • ID的生成机制.
  • 适当的冗余设计,不要过分追求高范式.

2.HQL优化

抛开缓存策略,和普通SQL语句优化策略相同.

3.主配置

  • 查询缓存:让完全一样的语句再次执行时可以利用缓存数据.在变更比较频繁的系统中,不建议使用缓存.
  • fetch_size:参数设置不要太大.同JDBC的设置差不过.
  • batch_size:同上.
  • 生成系统中,请关掉show_sql开关.

4.缓存

  • 数据库级缓存.
  • Session策略:在一个Session内有效,这级缓存课干预性不强.
  • 应用缓存:
    • 数据库不会被第三方修改.
    • 数据部会太大
    • 数据部会频繁更新
    • 数据会被频繁查询
    • 数据部是关键数据
  • 延迟加载:
    • 实体延迟加载
    • 集合延迟加载
    • 属性延迟加载

5.方法选用

  1. 对于大批量数据的处理:
  • 使用游标或是Iterator.请看代码:
  
  
  
  
  1. Session session = SessionFactory.openSession(); 
  2. Transaction tx = session.beginTransaction(); 
  3.  
  4. ScrollableResults itemCursor = session.createQuery( 
  5.                              "from Item"
  6.                              .scroll(); 
  7.  
  8. int count = 0
  9.  
  10. while(itemCursor.next()){ 
  11.     Item i = (Item)itemCursor.get(0); 
  12.     modifyItem(item); 
  13.     if(++count % 100 == 0){ 
  14.        session.flush(); 
  15.        session.clear(); 
  16.     } 
  17.  
  18. tx.commit(); 
  19. session.close(); 

注意这里的100要和你的配置文件中的Hibernate.jdbc.fetch_size设置相同.

  • 也可以使用Hibernate的自身的session解决这个问题.
  
  
  
  
  1. Session session = SessionFactory.openSession(); 
  2. Transaction tx = session.beginTransaction(); 
  3.  
  4. for(int i=0; i<100000; i++){ 
  5.     Item i = new Item(); 
  6.     session.save(); 
  7.     if(i % 100 == 0){ 
  8.       session.flush(); 
  9.       session.clear(); 
  10.     } 
  11.  
  12. tx.commit(); 
  13. session.close(); 

上面2个方法,均是使用了缓存,并且没有绕过hibernate,所以相关的监听器可以使用.如果你使用了bulk操作,则是没有使用缓存,且绕过hibernate,直接操作数据库,监听器无效,意味着无法再代码层实现日志审核.

  
  
  
  
  1. String sql = "update CreditCard set stolenOn <= :now where type = 'Visa'"
  2. Query query = session.createQuery(sql,newDate()).executeUpdate() 

直接操作数据库不会对你的Version操作,所以如果你使用了乐观锁的话,请自行增加Version值.并且sql语句中不能出现join.但可以在where子句包含子查询.

  • list和iterator
    • list只能利用查询缓存,无法利用二级缓存中的单个实体,但list查询出的实体会写入二级缓存.
    • iterator可以利用二级缓存,使用它会产生N+1条语句的情况.

未完.下面会说说集合的使用:


 

 

你可能感兴趣的:(优化,Hibernate,性能,缓存,调优)