hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
hibernate.jdbc.fetch_size50
hibernate.jdbc.batch_size25
这两个选项非常重要!!!将严重影响Hibernate的CRUD性能!
FetchSize是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出FetchSize条数,当纪录集遍历完了这些记录以后,再去数据库取FetchSize条数据。因此大大节省了无谓的内存消耗。当然FetchSize设的越大,读数据库的次数越少,速度越快;FetchSize越小,读数据库的次数越多,速度越慢。这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。
Oracle数据库的JDBC驱动默认的FetchSize=10,是一个非常保守的设定,根据测试,当FetchSize=50的时候,性能会提升1倍之多,当FetchSize=100,性能还能继续提升20%,FetchSize继续增大,性能提升的就不显著了,反而会消耗过多的内存。因此建议使用Oracle时至少要将FetchSize设到50。
不过并不是所有的数据库都支持FetchSize特性,例如MySQL就不支持。MySQL就像上面说的那种最坏的情况,他总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了。
BatchSize是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。BatchSize越大,批量操作的向数据库发送sql的次数越少,速度就越快。一个测试结果是当BatchSize=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,BatchSize=50的时候,删除仅仅需要5秒!!!
另外hibernate.max_fetch_depth设置外连接抓取树的最大深度取值.建议设置为0到3之间。就是每次你在查询时,会级联查询的深度,譬如你对关联vo设置了eager的话,如果fetch_depth值太小的话,会发多很多条sql,影响查询速率。