浏览 13900 次
锁定老帖子 主题:O/R Mapping性能
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-09-13
JDO只是一个标准,每个厂商实现的性能各有不同,不好评价。 Apache OJB的性能如何,Apache网站上面有评测。 Hibernate的性能我是花了点时间去研究的。Hibernate可以通过修改配置文件把所有的SQL语句都输出出来,你写一些测试代码观察一下输出的SQL,就什么都明白了。 简单的来说,Hibernate的性能比一个普通的Java程序员写的JDBC代码性能高非常非常多。原因是因为Hibernate本质上还是包装了JDBC来进行数据库操作的,由于Hibernate在调用JBDC上面是非常非常绞尽脑汁的优化JDBC调用,并且尽可能的使用最优化的,最高效的JDBC调用,所以性能相当令人满意。 简单来说吧,对于insert操作,普通JDBC程序员这样来写: pstmt = conn.prepareStatement("insert into table1 values(?,?);");; for (int i=0; i< names.length; i++); { pstmt.setString(1,names);; pstmt.setString(2,pass);; pstmt.executeUpdate();; } 如果批量插入n条记录的话,那么就是n次向数据库发送SQL语句。而Hibernate则是采用了JDBC2.0的batch功能。 for (int i=0; i< names.length; i++); { pstmt.setString(1,names);; pstmt.setString(2,pass);; pstmt.addBatch();; } pstmt.executeBatch();; 只是1次向数据库发送SQL,性能高下判若分明。Update操作类似。 select操作,可以使用JCS缓冲查询结果,重复查询比JDBC肯定要快很多,分页操作可以使用数据库的分页sql,或者使用JDBC2.0的scroll result。 另外Hibernate总是尽量延迟向数据发送SQL,它会先把SQL语句缓冲在Session的缓冲区里面,最后在flush的时候一次性的向数据库发送。 总体来说,当你使用Hibernate的时候,相当于有一个JDBC高手来帮你优化JDBC调用,那点封装了一层的损失可以忽略不计。 如果你非要认为Hibernate封装了JDBC会损失性能,那么我问你,Java设计的目标是组件可复用,这些不全都是封装吗?难到你调用组件都损失性能了,如果是那样,还不如不要写什么组件,全部都重新写原始的实现代码呢! 不过如果一个真正的JDBC高手,完全自己优化JDBC代码写DAO实现,我相信会比Hibernate性能高一些,但是Hibernate已经够优化了,你能够做的是非常有限的。就好比用C语言写的程序,虽然比汇编语言差一点,但是差的非常有限。Hibernate vs JDBC就相当于C vs Assemble,除非特殊需要,Hibernate已经足够好了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-09-13
可否说明一下,在那些情况下使用Hibernate比较容易产生性能问题。因为我使用Hibernate的经验还不多。也没有详细去做相关的测试。不知bruce是否有相关的经验可以告诉大家。
|
|
返回顶楼 | |
发表时间:2003-09-14
Hibernate 批量删除,批量更新跟JDBC相差较大。
Hibernate 的插入和查询速度与JDBC相差不大,大概比JDBC慢20%(我这里测试的,不过没用JCS) 我测试SLSB+DAO+CMP和 SLSB+DAO+Hibernate的贴子是 http://hibernate.fankai.com/viewtopic.php?t=18 不过,很早Robbin就说过测试没这么简单,我们这样的做的目的,只是对Hibernte, JDBC, CMP的速度及运作有一个大概的认识,没有什么权威性。测试结果也是仅供参考。 这一点请大家注意。 |
|
返回顶楼 | |
发表时间:2003-09-14
孤魂一笑 写道 可否说明一下,在那些情况下使用Hibernate比较容易产生性能问题。因为我使用Hibernate的经验还不多。也没有详细去做相关的测试。不知bruce是否有相关的经验可以告诉大家。
只要你正确的设置 Batch Size ,一般来说推荐为25,插入更新和删除都不会有性能问题,除非你配置错误。 最容易产生性能问题的地方是,当你使用Hibernate Iterator一次查询大量数据的时候,而你又没有使用JCS,那么性能是非常糟糕的。 如果没有使用JCS,那么当查询大量数据一定要采用List,如果使用JCS,那么用Iterator效率更好,可以看看我在性能版的一个测试报告。 |
|
返回顶楼 | |