免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: LiveHappy
打印 上一主题 下一主题

如何一次插入200万条记录? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-10-16 17:39 |只看该作者
一个是用PreparedStatement  
另外呢还是分批 插入试试吧

论坛徽章:
0
12 [报告]
发表于 2006-10-16 17:53 |只看该作者
原帖由 qn_0 于 2006-10-16 17:24 发表
why not use PreparedStatement


同上

论坛徽章:
0
13 [报告]
发表于 2006-10-17 10:47 |只看该作者
原帖由 tong0245 于 2006-10-16 16:12 发表

那你就生成文件再导入 .


不知道怎么生成文件可以快点,下面是这生成文件的代码,很慢,请指教下,谢谢


  1. int count = 2000000;
  2.         String outStr = "";
  3.         //但是这个循环很慢,我只测了下下面的for循环,光这个循环就执行近一个小时还没执行完这个循环
  4.         for(int i=0;i<count;i++)
  5.         {
  6.             outStr +="123456,"+i+","+ Math.round(Math.random() * 100000000)+"\n";
  7.             //System.out.println(i);
  8.         }
  9.         
  10.         File fileOut = new File("e://outTemp.dat");
  11.         try
  12.         {
  13.             fileOut.createNewFile();
  14.         } catch (IOException ex)
  15.         {
  16.         }
  17.         fileOut.canWrite();
  18.         FileOutputStream fileOutStr = null;
  19.         try
  20.         {
  21.             fileOutStr = new FileOutputStream(fileOut);
  22.         } catch (FileNotFoundException ex2)
  23.         {
  24.         }
  25.         BufferedOutputStream bufferedOut = new BufferedOutputStream(fileOutStr);
  26.         byte outBy[] = outStr.getBytes();
  27.         try
  28.         {
  29.             bufferedOut.write(outBy);
  30.         } catch (IOException ex3)
  31.         {
  32.         }
复制代码

论坛徽章:
0
14 [报告]
发表于 2006-10-17 12:35 |只看该作者
慢就慢吧

论坛徽章:
0
15 [报告]
发表于 2006-10-18 09:29 |只看该作者
org.apache.ddlutils

不要再去发明轮子了

论坛徽章:
0
16 [报告]
发表于 2006-10-18 09:53 |只看该作者
看错了,建议生成文件导入

ddlutils是一个很方便的工具 http://db.apache.org/ddlutils/

论坛徽章:
0
17 [报告]
发表于 2006-10-18 11:43 |只看该作者

  1.      for (int j = QiShiHaoMa; j < QiShiHaoMa + count; j++) {
  2.        proRandom randomM = new proRandom();//产生随机数
  3.        if (arrayList1.contains(j)) {
  4.          String JX = String.valueOf(arrayList2.get(j)) + "Բ";
  5.          String SQL = "insert into XinXi(fapysxx_dm,fapysxx_hm,fapysxx_mm,fapysxx_jx,fapysxx_qh) values(" +
  6.              DaiMa + "," + j + "," + randomM.createInteger() + "," +
  7.              JX + "," + QH + ")";
  8.          databaseCon3.executeUpdate(SQL);
  9.        }
  10.        else {
  11.          String SQL = "insert into XinXi(fapysxx_dm,fapysxx_hm,fapysxx_mm,fapysxx_jx,fapysxx_qh) values(" +
  12.              DaiMa + "," + j + "," + randomM.createInteger() + ",'" +
  13.              defaultJX + "'," + QH + ")";
  14.          databaseCon3.executeUpdate(SQL);
  15.        }




  16. //---------------------------在MySQL里可以这样,但在SQL Server我就不清楚了--------------------------------


  17. String SQL = "insert into XinXi(fapysxx_dm,fapysxx_hm,fapysxx_mm,fapysxx_jx,fapysxx_qh) values";

  18.      for (int j = QiShiHaoMa; j < QiShiHaoMa + count; j++) {
  19.        proRandom randomM = new proRandom();//产生随机数
  20.        if (arrayList1.contains(j)) {
  21.          String JX = String.valueOf(arrayList2.get(j)) + "Բ";
  22.               SQL += "(" + DaiMa + "," + j + "," + randomM.createInteger() + "," +JX + "," + QH + "),";
  23.           }else {
  24.          SQL +="(" +
  25.              DaiMa + "," + j + "," + randomM.createInteger() + ",'" +
  26.              defaultJX + "'," + QH + "),";
  27.         }
  28.    }

  29. //此处加一行代码处理掉SQL里的最后一个 ',' 号

  30. databaseCon3.executeUpdate(SQL);
复制代码


------------------------
不过对于二百万的记录不知我这种方法是否有用,应该是占内存太大了!!!

[ 本帖最后由 tsgx8848 于 2006-10-18 11:49 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2006-10-20 23:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
19 [报告]
发表于 2006-10-21 00:52 |只看该作者
创建事务
-over

论坛徽章:
0
20 [报告]
发表于 2006-10-21 08:07 |只看该作者
原帖由 myithead 于 2006-10-20 23:36 发表
用Hibernate或许也会简单些
另外,我记得好象string类型的对象,每用一次"+"连接,都会产生一个新的string对象,直到JVM关闭才会被释放,
因此,你的内存被耗光很有可能就是这些临时对象的占用.


hibernate 个屁   200万记录用hibernate
另外在循环中的对象只要循环结束会马上收集。

解决的简单办法是用stringbuilder 或者stringbuffer都可以。
另外"dddd"+"ddddd"+"ds"是不会重复创建对象的 编译器做了优化。
Sting ddd="dd";
dd+="dd"
编译器就没有办法了
技术问题说话还是要负责的 说屁话不好
另外告诉楼主 找出问题最好的方式是做profile
netbeans 和eclipse 都用相关的插件
原帖由 yaoxiujun 于 2006-10-21 00:52 发表
创建事务
-over


另外创建事务 创建个屁  事务事务 个屁
200W 记录就不应该闲的用程序那么去插入。
jdbc 再快每次也要串行化对象的 问题出在这里的问题更大。
如果楼主有心的话 做个profile 比什么都强 问什么问啊 性能问题很可能是多方面的。
要看你具体环境。

[ 本帖最后由 tong0245 于 2006-10-21 08:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP