现在由于业务的原因,需要向oracle数据库中的一个表插入百万级的数据(不超过500万),并且这些数据来记录自于文本文件(该文件每行的数据格式为:数字,字符,数字(如:12,type,1234))。我现在的实现方法是:
1.通过java解析该数据文件,然后把解析后的数据set到一个对象中(如:myObj对象)
2.把上面组装的所有myObj对象放到LIST中
3.对List(存放的是文件中解析出的所有记录对象)进行循环遍历分别调用sqlMapClient.insert(myObj);方法让数据入库。
现在这样的实现方法,要完成500万的数据记录的入库。耗时很难让人接受,并且现在是把这整个数据的入库当作一个整体事物来处理(即:只有500万数据都成功入库了才提交,如果有一个失败了,就都失败了),所以这样的实现是有问题的。
我又想了一个实现方式,就是写个过程my_test_proc(VARCHAR2 p_num,varchar2 p_type,varchar2 p_num2)放在oracle数据库上,然后在java代码中调用存储过程,因为我是这样想的,该存储过程是运行在数据库服务器上的(前一种方法是运行在本地的),并且数据库服务器的各种资源都要比本地的资源充足,运行的速度应该有所提升。不知道有没有一种方法能够把整个java中的对象链表LIST作为参数传入到my_test_proc过程中??请大家帮助,看是否有更好的方法实现百万级数据的入库。

解决方案 »

  1.   

    http://www.blogjava.net/Unmi/archive/2009/01/05/249956.htmlcsv,txt文件都可以
      

  2.   

    请大家介绍一下在java中怎么调用SQLLOADER?另外该控制文件中INFILE参数可不可以实现动态改变(以就是说我的数据文件的名字是随时变化的,我想让控制文件中的该参数也随着变化)?
      

  3.   

    500万方list里面。你内存不溢出吗?要是你的文件有几十G呢..
      

  4.   

    转成文本方式,用sqlload手工导入,比较靠谱
      

  5.   

    用外部表实现我们的业务也是有几百万记录,用外部表直接往表里面插入楼主可以google下外部表的创建、使用等等
      

  6.   

    http://blog.csdn.net/mantisXF/archive/2008/09/07/2896524.aspx
    Oracle 存储过程 实现 JAVA中的LIST输入参数
      

  7.   

    有哪位大侠知道使用sqlldr时,控制文件是放在数据库服务器上,还是放在本地服务器上?
      

  8.   

    直接用PLSQL Developer文本导入即可
      

  9.   

    直接用PLSQL Developer文本导入即可
    即菜单栏Tools -> Text Importer
    剩下的点点弄弄,就会了,很简单
      

  10.   

    回复于:2009-08-20 17:30:07
    直接用PLSQL Developer文本导入即可
    ------------------------------------
    大量数据导入时,会导致 PLSQL Developer 内存溢出而停止工作。全功尽弃!
      

  11.   

    本地我这又个脚本
    cmd 执行
    sqlldr userid=name/passwd control=E:\\result.ctl控制文件result.ctl为:
    load data
    infile 'E:\sql.txt'
    append 
    into table Test
    fields   terminated   by   "," 
    (x ,y ,z )sql.txt为要加载的数据
    1,2,3
    4,5,6
    7,8,8
      

  12.   


    一般放在数据库服务器上,如果放在本地,需要安装数据库客户端一般的终端不会安装oracle客户端的所以还是放在服务器端
      

  13.   

    19楼的ojuju10,如果我要导入的数据文件不在数据库服务器上(而你说的一般把控制文件放在数据库服务器上),那该怎么办呀?楼上几个说用PLSQL Developer进行导入,这样是不可取的,因为我要导入的文件一般是凌晨2,3点进行的,那时如果进行人工手动导入的话会很不方便。因此我想用java程序让其通过调用sqlldr userid=name/passwd control=E:\\result.ctl 自动的进行数据的导入。看大家还有什么好的方法!虽然分太少了点。请大家帮助!
    还有个问题就是19楼说的一般把控制文件放在数据库服务器上(因为ojuju10说,一般的客户端不会安装数据库客户端 ),而我要导入的数据文件不在数据库服务器上,我该怎么办?
      

  14.   


    sqlldr属于客户端工具,因而是文件是放在本地的。假设你用的产linux  Oracle 服务器,你在用的Windows PC上装个oracle客户端,把文件放到你的c:\  之类的,就能导入了
      

  15.   

    利用PreparedStatement,for循环将list数据放到PreparedStatement中,然后stmt.addBatch();
    最后stmt.executeBatch(); 在java中for循环500万次还是很效率的。对数据库只是一次访问效率还可以
      

  16.   

    楼主兄, 你这导入是一次性的事呢还是需要做成程序多次用?      若是一次性导入,根本就不用编程了,直接采用数据库的导入工具;  
          若是需要做成工具,而且你又偏爱java,没有办法,java的jdbc的确连接数据库会慢些,但只要你处理好了数据分批处理,并发处理,目标表的合理设计等工作,导入过程会顺利进行,只是时间可能稍长罢了。  
     
       
      

  17.   

    可以写个过程用Oracle的utl_files直接从文本读到表中,然后设个job定时执行
      

  18.   

    请问大家在PL/SQL过程中怎么调用sqlldr命令?
    直接在PL/SQL过程中这样写:“host sqlldr user/password control=\home\oracle\test.txt”
      

  19.   

    非要用java程序实现,感觉难度很大啊,关注中。
      

  20.   

    现在系统就是用java搞的分批处理!但我觉得还是用sqlldr比较快。
    现在处理500w要几个小时,但用sqlldr一眨眼的功夫就o了。
      

  21.   

    楼主去我的blog,里面有传2维数组进去的例子,建表,建对象,存储过程。java代码调用,都是全的我这里就不拷贝代码了。你去看看,稍微改下就可以了。
    不是做blog的广告,我blog里面没几篇文章,你很快就找到了。
    二维数组情况下,父表100条,子表10000条,导入时间3~4秒。前提是表上没有建索引和主键。
    对了你100万,最好程序里面一次传入10000条,否则数据库一次进100万的数组,可能吃不消。
      

  22.   


    500w几个小时?那是你程序的问题。一条条commit,当然效率低。
      

  23.   

    我不是一条一条的commit的,其实就commit语句的执行而言,其花费的时间都是一样的;具体的差别是如果一条一条的commit这样消耗的撤销空间比较大,如果是几千条或更多一起commit这样消耗的撤销空间相比要少一些的。就我在代码中列子而言,我是1000条commit一次,不过我知道1000条commit一次也算是比较少的了。但我用的java的批量插入方式,不知道怎么的,只支持这个量(1000为一次提交的最大量)。
      

  24.   

    对,用SQLLDR,具体用法,你可以自己网上查,可分布式提交。
      

  25.   


    oracle数据库中有对一次批量提交的数据记录数有限制吗?
    如果有限制,怎么修改oracle的相关参数?让oracle支持一次性提交的记录数加大一点。
      

  26.   


    这个系统要插入的数据是第三方系统通过ftp上传到本系统的,并且传来的该文件还包含一些其他信息,比如说版本号,系统号等等。
    该文件是要经过我放系统进行解析并进行转存操作的。所以该文件是很不规范的(并不一定满足外部表的一些定义),如果真的要用外部表的话,当我方系统在转存时,那将会生成一个满足一定格式的有利于外部表操作的文件,但我们没有这样做。我们直接解析出文档中要插入的数据进行入库操作。
      

  27.   

    对方的文件是怎么过来的呢?如果可以的话直接传到数据库服务器,晚间批量用dbms_scheduler和外部表实现,也可以用dbms_scheduler调用shell执行sqlload实现功能,这么大的数据量放应用服务器处理是不切实际的
      

  28.   

    建议使用sqlloader.  Oracle SQL Loader
    http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4674063.aspx这个是自己写配置文件的方法。 如果使用Toad 的话要方便很多。 Toad 中有个 sql loader 向导, 在里面指定要导入的文件(txt等格式的),然后就直接下一步就可以了。 我用sqlloader 导6万的数据, 不到10秒中, 所以500万也用不了多长时间。 ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    Q Q 群:62697716 
      

  29.   

    使用SQLLOADER需要将数据文件传到服务器端。
    可以试下每10000条左右提交一次,而不需要等到全部插入在提交。
      

  30.   

    说实话, 五百万真不多, 先把这500万扔list中也是没有问题的。
    然后批量插入; 也就是几分钟的事。oracle的话, 大约30多分钟吧!