当前位置:编程学习 > JAVA >>

Hibernate插入数据的速度为什么这么慢

今天无聊试着往数据库中插入10000条记录,没想到竟然执行了2分16秒的时间才插入完毕。
这样的结果正常吗?

这个是com.test.dao.impl.UserDaoImpl.java类中的插入方法。

public void saveUser(User user) {
// TODO Auto-generated method stub
double i;
for(i=0;i<10000;i++)
this.getHibernateTemplate().save(user);



控制台显示类似下面的结果
Hibernate: insert into users (firstname, lastname, age, id) values (?, ?, ?, ?)
Hibernate: insert into users (firstname, lastname, age, id) values (?, ?, ?, ?)
Hibernate: insert into users (firstname, lastname, age, id) values (?, ?, ?, ?)
Hibernate: insert into users (firstname, lastname, age, id) values (?, ?, ?, ?)
………………还有很多


数据表users的各字段如下
id int,
firstname varchar(50),
lastname varchar(50),
age int



--------------------编程问答-------------------- 用的什么数据库 --------------------编程问答-------------------- Hibernate是挺慢的,不过也没有楼主说的那么慢啊。。。 --------------------编程问答-------------------- 哎,楼主纠结这个干什么.....1W条撒...2分钟也太慢了... 是调试运行吗?。。我发邮件的话开启调试就很慢...
--------------------编程问答-------------------- 额,这个还真没试过。 --------------------编程问答-------------------- 还真的不知道 --------------------编程问答--------------------
引用 1 楼 jayyounger 的回复:
用的什么数据库


数据库是mysql5.0的 ,
直接写SQL语句插入的速度就很快
而写HQL成后速度就慢的离奇 --------------------编程问答-------------------- 你电脑问题。 --------------------编程问答--------------------
引用 3 楼 guominghua2 的回复:
哎,楼主纠结这个干什么.....1W条撒...2分钟也太慢了... 是调试运行吗?。。我发邮件的话开启调试就很慢...



是在调试模式下执行的,不过我刚才特意把调试模式禁用掉后测试了一下,循环插入10000条记录的时间还是2分多钟 --------------------编程问答-------------------- 没这么慢吧? --------------------编程问答-------------------- 我试过,没有这么慢,一定是哪里有问题的了。 --------------------编程问答-------------------- 开什么玩笑,和jdbc速度差不多 --------------------编程问答-------------------- 执行方式的问题 --------------------编程问答-------------------- 这个是很正常的,如果你的CPU运算速度还行的话。还好点。要不然更慢的。 --------------------编程问答-------------------- show_sql,会慢很多的 --------------------编程问答--------------------
引用 6 楼 bing63983627 的回复:
引用 1 楼 jayyounger 的回复:

用的什么数据库


数据库是mysql5.0的 ,
直接写SQL语句插入的速度就很快
而写HQL成后速度就慢的离奇


我想知道你直接写sql插入速度有多快。
如果不设置关闭自动提交或批量提交的话,速度应该是差不了多少的吧。 --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- hibernate对于大数据的处理 明显性能明显不如jdbc,它是负责数据库持久化。 --------------------编程问答-------------------- 我亲自在eclipse3.7试了一下,插入对象为public class Employee {
private Integer id;
private String name;
private String email;
private Date hiredate;

先保存,最后提交,10000条每保存一条0ms,总共花费6000+ms
代码{
int count = 1;
long start0 = new Date().getTime();
Configuration c = new Configuration().configure();
SessionFactory s = c.buildSessionFactory();
Session s0 = s.openSession();
Transaction t = s0.beginTransaction();
for(int i=0;i<10000;i++){
long start = new Date().getTime();
Employee e = new Employee();
e.setName("czg");
e.setEmail("453205586@qq.com");
e.setHiredate(new Date());
s0.save(e);
long end = new Date().getTime();
//t.commit();
System.out.println("第" + count++ + "次,花费: " + (end - start) + "ms");
}
System.out.print("插入完毕!");
t.commit();
s0.close();
long end0 = new Date().getTime();
System.out.println("花费: " + (end0 - start0) + "ms");
}
控制台显示:
.......
第9997次,花费: 0ms
第9998次,花费: 0ms
第9999次,花费: 0ms
第10000次,花费: 0ms
插入完毕!花费: 5953ms
速度还行! --------------------编程问答-------------------- 我补充!
我尝试1000000条(100w)出错了,控制台:
........第749614次,花费: 0ms
第749615次,花费: 0ms
第749616次,花费: 0ms
第749617次,花费: 1735ms
第749618次,花费: 0ms
第749619次,花费: 0ms
第749620次,花费: 1734ms
第749621次,花费: 0ms
第749622次,花费: 1750ms
第749623次,花费: 0ms
第749624次,花费: 0ms
第749625次,花费: 0ms
第749626次,花费: 3500ms
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedHashMap.createEntry(Unknown Source)
at java.util.LinkedHashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at org.hibernate.util.IdentityMap.put(IdentityMap.java:170)
at org.hibernate.engine.StatefulPersistenceContext.addEntry(StatefulPersistenceContext.java:503)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:273)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:143)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:712)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:700)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:696)
at test.main(test.java:23) --------------------编程问答-------------------- 尝试插入40W条,保存花费2+S,提交花费127828ms
第399999次,花费: 0ms
第400000次,花费: 0ms
插入完毕!花费: 127828ms --------------------编程问答--------------------
引用 19 楼  的回复:
我补充!
我尝试1000000条(100w)出错了,控制台:
........第749614次,花费: 0ms
第749615次,花费: 0ms
第749616次,花费: 0ms
第749617次,花费: 1735ms
第749618次,花费: 0ms
第749619次,花费: 0ms
第749620次,花费: 1734ms
第749621次,花费: 0ms
第749622次……

这个很正常,因为hibernate在插入数据的时候,Employee对象一直在缓存中保留
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,