hibernate 写入性能暴差,如何配置

lifejoy 2006-09-15 06:00:55
偶在做一个大量的数据采集项目,数据库使用的Mysql(先前已经测试,写入速度在100M的局域网上的速度大于3000/S).
为了省事偶使用了hibernate3,换了台服务器(此服务器直接写入速度大于1200/S,主要是带宽不足造成),
使用如下的配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

<session-factory>
<property name="connection.username">root</property>
<property name="connection.url">
jdbc:mysql://192.168.0.199/newplat
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="myeclipse.connection.profile">mysqldriver</property>
<property name="connection.password">avcvdd</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="current_session_context_class">thread</property>

<!-- Disable the second-level cache -->
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<property name="jdbc.batch_size">25</property>
<property name="connection.pool_size">0</property>
<property name="show_sql">false</property>
写入速度降低到30/S,在网路上查找无果,请教各位贤达!
...全文
2797 点赞 收藏 36
写回复
36 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
会Java的蝈蝈 2006-09-22
对于这种批量操作,也不一定要放到应用层里做啊。程序准备好数据,调一个存储过程效率会好些的
回复
angelheart 2006-09-22
首先,多了Hibernate这一层肯定速度比直接用jdbc慢,但是绝不会慢这么多,这里面肯定是代码的实现问题,我们大部分人都没那个时间和精力去读Hibernate的源代码
回复
awded 2006-09-21
其原因是你每次通过Hibernate 插入数据后,产生的对象并没有对垃圾回收器收集,而是被session 对象纳入了管理。也就是说随着你的插入增多,session中的对象也越来越多,直到达到10万的数量级。
此时session 不用说往数据库里插数据了,单纯替你检查新增对象所耗费的CPU 时间就极其可观!这也是为什么越往后速度越慢的原因
希望楼主能够多看一点再做结论
回复
awded 2006-09-21
楼主也不用说Hibernate 是一个半成品了,有这么多的公司甚至银行系统都用Hibernate 就证明了它的稳定性和速度。

你在session.flush() 后面加上一条session.clear() 再试试看速度
回复
angelheart 2006-09-21
to:supperman_009(天堂草)

如果没指定DATASOURCE,Hibernate默认就是用自己的连接池。。
回复
自然80 2006-09-21
mark。
自己一会做个测试。(纯粹的写操作,Hibernate肯定会比jdbc慢,因为Hibernate也是通过jdbc的做的,而且它还做了其它一些事。但是觉的不会象楼主说的那样相差那么大)
如果是纯粹的写入操作,干吗不数据库自带的导入操作,不是更高效么。
回复
夜魔009 2006-09-21
楼主的理论看似合理而实际上呢?你试过Hibernate的连接池等高级特性了吗?想要超过JDBC不是不可能的,并发操作和单线程操作是有很大性能上的区别的,您的测试并没有给出CPU和内存利用的情况。通过时空兑换法则,Hibernate是可以通过空间换取时间,最终青出于篮而胜于篮,是可以做到的。另外单线程的CPU和多核或者超线程CPU对程序的影响是巨大的。不能说Hibernate源自JDBC就一定比JDBC慢啊。因为在开发Hibernate的时候不知道你是不是输出了log,也就是Log4j你定义的是不是DEBUG,这样会使Hibernate慢至少2倍,关闭日志或者设置日志为ERROR级别。再看看吧,呵呵。
一向认为这样的测试都是胡扯蛋的,首先在方案上有有倾向性,并不是一种真正意义上的测试,如果不考虑CPU和内存利用曲线,光看结果,精通Hibernate的人是可以将Hibernate调试的比JDBC快的,因为它支持连接池操作,这是优于JDBC的更高级的管理功能。
回复
hallywang 2006-09-21
假的。。
回复
自然80 2006-09-21
我作了个测试 mysql5.0,hibernate3.1,mysql-connector-java-5.0.3-bin.jar
在batch_size=50时,插入10000条数据
时间比是:hibernate/JDBC=1.2393
并没有作者的那么夸张。
回复
TinyJimmy 2006-09-21
看来楼主自己解决, 不愿意和大家分享. 无语
回复
xwj1003 2006-09-21
我正在看Hibernate
看了这篇文章 对我打击真打啊
到底是什么问题啊?

楼主解决了吗?
回复
jacklondon 2006-09-21
楼主也不用说Hibernate 是一个半成品了,有这么多的公司甚至银行系统都用Hibernate 就证明了它的稳定性和速度。?????
这句话没有太多理由。这么多的公司甚至银行系统都用的东西多着呢,Hibernate 是,JDBC 也是。没有办法证明稳定性和速度。
回复
harston 2006-09-19
怎么解决的说?共享下萨
回复
jacklondon 2006-09-19
Hibernate 优化的是读,不是写。
回复
lifejoy 2006-09-18
因为采集的项目很多,而且本地采用的是BDB,其实采用Hibernate是为了降低开发时间的说,我们这边的一个工程师已经通过分析hibernate的代码,解决了个问题性能能达到jdbc的70%左右。可以说满足了我们的要求,我们的模块是独立的,如果以后性能不足的化可以通过替换服务来更新。谢谢大家参与。
回复
kubbye 2006-09-17
偶来学习
回复
mooniscrazy 2006-09-16
如果hibernate真的性能这么差,那么它的写法有严重问题。我也作了一下测试,发现用hibernate时,cpu占用率达到100%,而测试程序占了大部分的cpu时间。
而用jdbc测试时,cpu占用率只有70%,数据库本身占用了大部分的cpu时间。这证明hibernate的运算效率极其低下。
所谓最好的优化就是不优化,在hibernate上得到了证实。。。
回复
mooniscrazy 2006-09-16
难道这么多用hibernate的人,没有几个人做过压力测试吗?这么严重的问题,竟然没有人提出来过?
回复
lifejoy 2006-09-16
效率的牺牲,不能以超过倍的。如果效率下降一倍那么就是在抹杀其他的人的工作。另外没有任何的一份hibernate的文档说明了其写入效率低下,但是鼓吹其性能高的文档却是大有人在。
如果是没有人测试那么还可以说是工作做的不足,如果测试了发现了问题却没有人提出这些问题。那么就除了事情了。如果是爱则愿其永生,恨则咒其死....
但是如果是如同一个哥们所说:现在竞争如此激烈。。。。。让他们走点弯路。。。。。
无语.
回复
fatcatman 2006-09-16
mark
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2006-09-15 06:00
社区公告
暂无公告