1-及时清除Session一级缓存

在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,

所以在使用Hibernate处理大数据量的,可以使用session. clear()或者session. evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象。

 

2-推荐使用延迟加载机制

在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时才会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。

立即加载的缺点

Hibernate在查询某个对象时,立即查询与之关联的对象,我们可以看出这种加载策略存在两大不足:

  • select的语句数目太多,需要频繁的访问数据库,会影响查询的性能。
  • 在应用程序只需要访问要的对象,而不需要访问与他关联的对象的场景下,加载与之关联的对象完全是多余的操作,这些多余的操作是会占内存,这就造成了内存空间的浪费。

 

什么时候使用延迟加载?什么时候使用立即加载?

  • 如果程序加载一个持久化对象的目的是为访问他的属性,则可以采用立即加载。
  • 如果程序加载一个持久化对象的目的仅仅是为了获得他的引用,则可以采用延迟加载。

  Hibernate中允许使用延迟加载的地方主要有以下几个地方:

<hibernate-mapping default-lazy=(true|false)”true”>:设置全局的延迟加载策略。
<class lazy=(true|false)>:DTD没设置默认值,推理默认值为true
<property lazy=(true|false)>:设置字段延迟加载,默认为false
<component lazy=(true|false):默认为false
<subclass lazy=(true|false)>:默认设置为true
<join-subclass lazy=(true|false)>:默认设置为true
<union-subclass lazy=(true|false)>:默认设置为true
<many-to-one lazy=(proxy|no-proxy|false)>:默认为proxy
<one-to-one lazy=(proxy|no-proxy|false)>:默认为proxy
<map lazy=(true|extra|false)>:默认为true
<set lazy=(true|extra|false)>:默认为true
<bag lazy=(true|extra|false)>:默认为true
<ibag lazy=(true|extra|false)>:默认为true
<list lazy=(true|extra|false)>:默认为true

 

3-少用“多对多”“一对一”,拆分为“多对一”或者“一对多”

由于“多对多”关联的性能不佳(由于引入了中间表,一次读取操作需要反复数次查询),因此在设计中应该避免大量使用。

如果纯粹地使用“一对一”, 关联表的主键就是主表的主键,这样一旦业务有变更那就得改结构。所以不如直接建立成“多对一”的

 

4-关键参数设置

1)show_sql设置为false,避免大量写入日志,会产生巨大的IO操作。如果真的要显示sql,可以提高日志级别降低日志的写入量,亦或通过缓存批量的写入。

2)设置下面两个属性,这两个选项非常重要!!!将严重影响Hibernate的CRUD性能!

参考:hibernate的速度问题--hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size

//hiberante.cfg.xml(Oracle ,sql server 支持,mysql不支持)

<property name="hibernate.jdbc.fetch_size">50</property>
<property name="hibernate.jdbc.batch_size">30</property>

 

 hibernate.jdbc.fetch_size 是设定JDBC的Statement“读取”数据的时候每次从数据库中取出的记录条数。

  • 例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。
  • 因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。

hibernate.jdbc.batch_size 是设定对数据库进行"批量删除,批量更新和批量插入"的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。