一、简介
测试hibernate+MySQL在不同情况下,分别插入1万、5万、10万、30万条数据花费的时间。
运行环境:Windows7(8核,4G)
软件环境:Eclipse(Tomcat7,Debug模式)、JDK1.7、hibernate4.3.6
数据库:Mysql5.5.28
* 存储过程(java调用)的作用:插入单条数据,由java循环调用
* 所有操作都伴随着事务,否则很慢很慢
二、 应用服务器和数据库服务器部署在不同的机器上,比较‘hibernate hql’和‘java调用Mysql存储过程’分别插入1万、5万、10万、30万数据花费的时间。
结论:
1 | 单线程效率最低 |
2 | 8核CPU,3线程最优,多开线程并没有提升(反而是变差了) |
3 | hibernate hql效率优于存储过程 |
4 | 第一次执行速度比之后的慢,可能与预编译sql有关 sql预编译 |
* 大量插入数据太费时,所以有些数据是空的。根据其他数据的运行结果,应该可以估算出来。
三、应用服务器和数据库服务器部署在相同的机器上,比较‘hibernate hql’、‘java调用Mysql存储过程’和‘hibernate sql’分别插入1万、5万、10万、30万数据花费的时间。
结论:
1 | 单线程效率最低 |
2 | 8核CPU,3线程最优(某些情况下5线程更优) |
3 | 运行效率:hibernate sql > procedure > hibernate hql |
4 | 第一次执行速度比之后的慢,可能与预编译sql有关 |
5 | 另外测试了存储过程(非java调用),速度非常快。见最右下角 |
6 | 部署在不同机器上的操作比部署在相同机器上的操作慢2-6倍(随着数量增加倍数增加),说明网络IO远比执行sql本身要慢得多 |
HQL与SQL:当然是SQL快啦,hql最终也是要转为SQL的,我个人认为他的价值只在跨数据库,hql转换成SQL是一个复杂的过程,也算hibernate的核心部分了,所以还是SQL来的直接,不用转换直接查,缓存方面也可用其他方案,设想一下如果你用SQL+缓存肯定更快的。