在使用 Hibernate 时, 其配置文件的各个参数有多个, 一些参数设置和意义列举如下:
1,hibernate.show_sql false
[ | true ]
是否将Hibernate发送给数据库的sql显示出来, true 显示, false 不显示,这是一个非常非常有用处的功能。当你在调试Hibernate的时候,让Hibernate打印sql语句,可以帮助你迅速解决问题。
2, hibernate.jdbc.fetch_size 50 [ | 100 ]
是设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数。例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会 1次性把1万条取出来的,而只会取出 Fetch_Size 条数,当纪录集遍历完了这些记录以后,再去数据库取 Fetch_Size 条数据。因此大大节省了无谓的内存消耗。当然 Fetch_Size 设的越大,读数据库的次数越少, 网络连接次数更少,速度越快;Fetch_Size 越小,读数据库的次数越多,
网络连接次数更多,速度越慢, (这里是影响性能的关键之处)。这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。
Oracle数据库的 JDBC 驱动默认的 Fetch_Size=10,是一个非常保守的设定,根据测试,当Fetch Size=50 的时候,性能会提升1倍之多,当Fetch_Size=100,性能还能继续提升20%,Fetch_Size 继续增大,性能提升的就不显著了。建议使用Oracle的一定要将 Fetch_Size 设到50。
不过并不是所有的数据库都支持 Fetch_Size 特性,例如MySQL就不支持。MySQL就像我上面说的那种最坏的情况,他总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了.
3, hibernate.jdbc.batch_size
30 [ | 50 ]
是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。Batch_Size 越大,批量操作的向数据库发送sql的次数越少,速度就越快。我做的一个测试结果是当 Batch_size=0 的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch_Size = 50的时候,删除仅仅需要5秒!!!可见有多么大的性能提升!很多人做Hibernate和JDBC的插入性能测试会奇怪的发现Hibernate速度至少是JDBC的两倍,就是因为
Hibernate使用了Batch Insert,而他们写的JDBC没有使用Batch的缘故。根据经验来看,Oracle数据库 Batch_Size = 30 的时候比较合适,50也不错,性能会继续提升,50以上,性能提升的非常微弱,反而消耗内存更加多,就没有必要了。
摘自网上资料....