hibernate 插入大量数据的 效率

tpz_stamp 2009-11-24 05:34:18
数据库是oracle,主键来自sequence。当插入一颗树到多个表里时,(e.g. Scholl -> Grade -> Class -> Student),取得sequence.nextval,的过程相当慢,导致整个插入过程长的无法接受,大家有什么办法处理这种情况吗?
...全文
977 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuimanqingyi 2010-05-31
  • 打赏
  • 举报
回复
我现在也遇到了类似的问题
先从数据库中查出数据 然后一条条处理 5W条左右
太慢了 不知道该咋办
tjb1216 2009-11-30
  • 打赏
  • 举报
回复
刚接触hibernate,好东西,帮顶一下
flower1515 2009-11-30
  • 打赏
  • 举报
回复
hibernate官方推荐的做法是:用循环插入,然后设置一个条数,定时清空缓冲区。
比方你插入10000W一次,你可以设置每100条你就调用session.flush();ssesion.clear();这个表示立即将当前这100条写入数据库并释放内存
hbwhwang 2009-11-27
  • 打赏
  • 举报
回复
呵呵,怪问题。
重新安装ORACLE试一下,还不行就到ORACLE论坛上求助吧
chen7788 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bingliang008 的回复:]
引用 6 楼 zl3450341 的回复:
写存储过程吧

我也支持写存储过程
[/Quote]

赞同!
datiechui 2009-11-27
  • 打赏
  • 举报
回复
数据用java代码加,主键用触发器加,我插入2000多条数据只用了几秒钟
下面是我的部分java源代码,插入数据时不包含主键
Connection con = session.connection();
PreparedStatement prestmt = null;
strsql = "insert into CB_REPORTMX (REPORTID,dirid, LH, HH, SHEET, ZHI, LX, YWRQ, GSDM) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
prestmt = con.prepareStatement(strsql);
for (i = 0; i < record.length; i++) {
values = Untitl.splitString(record[i], (char) 2 + "");
prestmt.setString(1, reportid);
prestmt.setLong(2, cbreportml.getId());
prestmt.setString(3, values[0]);
prestmt.setString(4, values[1]);
prestmt.setString(5, values[2]);
prestmt.setString(6, values[3]);
prestmt.setString(7, values[4]);
prestmt.setString(8, ywrq);
prestmt.setString(9, (String) httpsession.getAttribute("Dwdm"));
prestmt.addBatch();
}
prestmt.executeBatch();
prestmt.close();
下面是触发器源代码,在数据库中建,用来插入主键
create or replace trigger reportmx_bir --创建行级触发器
before insert on cb_reportmx
for each row
begin
select SQREPORTMX.nextval into :new.ID from dual;
end reportmx_bir ;
yuyeyi 2009-11-27
  • 打赏
  • 举报
回复
楼主可以试20条提交一次试试
datiechui 2009-11-27
  • 打赏
  • 举报
回复
用PreparedStatement
fztjava 2009-11-27
  • 打赏
  • 举报
回复
优化sql
godlike 2009-11-27
  • 打赏
  • 举报
回复
up
shrek11 2009-11-27
  • 打赏
  • 举报
回复
在操作数据库的时候,不要
一次性提交,大概执行了10个SQL提交一次.
liguominz 2009-11-27
  • 打赏
  • 举报
回复
写存储过程应该会快很多~
zhoushijin5201314 2009-11-27
  • 打赏
  • 举报
回复
写存储过程吧啊,不过移植手影响啊,用JDBC试下吧
crazylaa 2009-11-27
  • 打赏
  • 举报
回复
漂到第2页了,帮顶
xuexijava 2009-11-26
  • 打赏
  • 举报
回复
up
huailing963 2009-11-26
  • 打赏
  • 举报
回复
学习下
tpz_stamp 2009-11-26
  • 打赏
  • 举报
回复
我又在自己机器上装了个oracle,做了同样的测试,读1000个sequence不到1秒。。。

我要疯了,以前都是连到服务器上的oracle上做的测试,得到了这个奇慢的怪异结果。但在同样服务器上插1000条数据,只要不到3秒,其中包括运行其他程序逻辑。

我要疯了,这吊问题竟然搞了我4天。
laker_914 2009-11-26
  • 打赏
  • 举报
回复
帮顶
meander 2009-11-26
  • 打赏
  • 举报
回复
up
tpz_stamp 2009-11-26
  • 打赏
  • 举报
回复
我用的oracle JDBC driver 是 ojdbc14.jar。我写了个最简单的程序,没有spring, 没有hibernate,自己建一个connection到数据库,然后读sequence 1000次,然后关闭连接。 这样去读sequence,同样非常非常非常非常非常的慢,差不多要1秒一个,我不知道问题在哪里,从来没有遇到这样的问题,以前一直用的mysql,ms sql,table 主键是 identity式的,从来没有过这种问题。
加载更多回复(22)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧