Java Oracle 插入100万条记录

mdqy195905 2009-11-08 09:57:36
如何能够缩短时间?


public static void main(String[] args) throws ClassNotFoundException, SQLException
{
Connection con = DBUtil.getConnection();
con.setAutoCommit(false);
PreparedStatement ps =con.prepareStatement("insert into BigInsert nologging values (?)");
long start = System.currentTimeMillis();
for(int i=1;i<1000001;i++)
{
ps.setInt(1, i);
//ps.executeUpdate();
ps.addBatch();
if(i%10000==0)
{
ps.executeBatch();
ps.clearBatch();
}
}
con.commit();
long end = System.currentTimeMillis();
System.out.println(end-start);
ps.close();
con.close();

}


能不能在2~5S内完成?
...全文
949 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujun3512159 2011-10-08
  • 打赏
  • 举报
回复
呵呵,学习一下。
Huangyifei 2011-10-08
  • 打赏
  • 举报
回复
It looks great
jc8futao 2011-10-08
  • 打赏
  • 举报
回复
LZ的速度,我觉得基本正常,毕竟有这么多的数据。如果再快一些的话,就要考虑使用命令行工具sqlldr了。当使用direct=true模式是会非常的快。但是会有副作用。比如会忽略所有的触发器以及检查,会索引会失效,然后在导入数据结束的时候会重建索引。如果是唯一索引,可能会重建失败而失效。如果真到这个速度不可接受的话。那么可以先将数据写入文件。现在的IO效率是远远超过DB的,然后再用sqlldr工具导入。基本上这个速度上提高几十倍是没问题的。
jc8futao 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 spiniper 的回复:]

引用 7 楼 paullbm 的回复:
使用多线程方式进行插入。。
比如你可以使用5个线程,将100W进行分段,一个线程对应一个段。



在单cpu的情况下,多线程并不会解决任何速度上的问题。因为在cpu时间片段上,仍旧是单线程的。
[/Quote]
多线程是有效的,因为SQL操作的时间主要花在了和DB打交道的时间上了,如果使用多线程,会利用其这些时间片。即使是单核CPU
softroad 2011-10-08
  • 打赏
  • 举报
回复
存储过程应该好一点。
celeron729 2011-10-08
  • 打赏
  • 举报
回复
oracle 的 bulk insert
Inhibitory 2010-01-23
  • 打赏
  • 举报
回复
多线程只有在多个[核心的]CPU上有用, 如果有N个CPU[核], 则线程数量为N或者N+1时效率最高.
多线程很多时候主要是为了阻止IO阻塞, 提高用户体验, 多任务同时进行, 而效率并不一定会提高, 甚至会降低效率.
fuyou001 2010-01-23
  • 打赏
  • 举报
回复
如果是oralce 的话,用oraclePreparedStatemente, 或 直接写一个过程,直接调用过程
还有,你先把数据库 表 设置为nologging,再使索引失索!你可以批处理的量调大点
  • 打赏
  • 举报
回复
IO 操作的并发率为 0,也就是说不支持并发。
  • 打赏
  • 举报
回复
可以像 28 楼所说的,添加优化器,避免 Oracle 记录重做日志,这样也会减少一些 IO 操作。

PS:性能瓶颈在 IO 上,如果是 IO 瓶颈的话,那采用多个线程的话或许还不如一个线程来得快,毕竟磁盘的磁头只有一个。
ghchen 2010-01-22
  • 打赏
  • 举报
回复
我觉得多线程的效果也差不多, 楼主可以方式把batch的大小缩小到1000看看
SambaGao 2010-01-22
  • 打赏
  • 举报
回复
insert /*+append*/ into t select * from dba_objects nologging;

SQL语句中的优化提示
APPEND : Only valid for INSERT .. SELECT. Allows INSERT to work like direct load ,把数据放到hwm后面的数据块中

再加上nologging 会更快。

可以试试
psyuhen 2010-01-22
  • 打赏
  • 举报
回复
呵呵。。。应该可以控制在2-5s的吧。
guoyueshan 2010-01-21
  • 打赏
  • 举报
回复
把commit语句移到这个if块里面,事务不要太大

if(i%10000==0)
{
ps.executeBatch();
ps.clearBatch();
}
树成 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 paullbm 的回复:]
使用多线程方式进行插入。。
比如你可以使用5个线程,将100W进行分段,一个线程对应一个段。

[/Quote]

在单cpu的情况下,多线程并不会解决任何速度上的问题。因为在cpu时间片段上,仍旧是单线程的。
hoof82 2010-01-21
  • 打赏
  • 举报
回复
用多线程,用内存数据库,比较快。
phyerbarte 2010-01-21
  • 打赏
  • 举报
回复
使用多线程,100w数据开10个线程,10w一插,试下,公司做过多线程查询,效果不错,但是倒没多线程的插入,把结果发来看看。
不吃鱼的熊 2010-01-21
  • 打赏
  • 举报
回复
建议100 条记录,提交一次事务!
tangqingguang111 2010-01-21
  • 打赏
  • 举报
回复
说话不腰疼啊,用上面的程序5秒能插入100万?
GG_wg 2009-11-09
  • 打赏
  • 举报
回复
直接insert into tablename values select * from tablenameA having column 《= 100W
加载更多回复(19)

62,614

社区成员

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

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