现在由于业务的原因,需要向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.通过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过程中??请大家帮助,看是否有更好的方法实现百万级数据的入库。
解决方案 »
- 关于数据库数据查询效率
- PRO*C+MFC写的程序,发布时需要打包ORACLE客户端吗?
- windows7安装oracle 10g安装过程及注意事项
- 在线等待,这样的数据存储过程怎么写?分不够再加!急!!!!
- 老大们来看看:oralce存储过程问题?
- 关于数据库链接的问题
- 新手入门级问题,关于字母大小写的查询问题,譬如说ABC,abc,Abc,AbC这些类似的数据,我想一次就能都查询出来,怎么写这个语句?
- 用oracle 写一个金额大小写转换的函数
- 我已将数据库清空,但是我的 blob 字段还是插入不了数据,就连原来能够插入的,很小的数据都无法插入了,是不是 blob 字段的删除不干净呢
- 关于使用sqlldr的问题
- 为什么oracle 10g的服务器连不上我的oracle 11g的服务器??
- 如何判断数组中是否存在重复的值?
Oracle 存储过程 实现 JAVA中的LIST输入参数
即菜单栏Tools -> Text Importer
剩下的点点弄弄,就会了,很简单
直接用PLSQL Developer文本导入即可
------------------------------------
大量数据导入时,会导致 PLSQL Developer 内存溢出而停止工作。全功尽弃!
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
一般放在数据库服务器上,如果放在本地,需要安装数据库客户端一般的终端不会安装oracle客户端的所以还是放在服务器端
还有个问题就是19楼说的一般把控制文件放在数据库服务器上(因为ojuju10说,一般的客户端不会安装数据库客户端 ),而我要导入的数据文件不在数据库服务器上,我该怎么办?
sqlldr属于客户端工具,因而是文件是放在本地的。假设你用的产linux Oracle 服务器,你在用的Windows PC上装个oracle客户端,把文件放到你的c:\ 之类的,就能导入了
最后stmt.executeBatch(); 在java中for循环500万次还是很效率的。对数据库只是一次访问效率还可以
若是需要做成工具,而且你又偏爱java,没有办法,java的jdbc的确连接数据库会慢些,但只要你处理好了数据分批处理,并发处理,目标表的合理设计等工作,导入过程会顺利进行,只是时间可能稍长罢了。
直接在PL/SQL过程中这样写:“host sqlldr user/password control=\home\oracle\test.txt”
现在处理500w要几个小时,但用sqlldr一眨眼的功夫就o了。
不是做blog的广告,我blog里面没几篇文章,你很快就找到了。
二维数组情况下,父表100条,子表10000条,导入时间3~4秒。前提是表上没有建索引和主键。
对了你100万,最好程序里面一次传入10000条,否则数据库一次进100万的数组,可能吃不消。
500w几个小时?那是你程序的问题。一条条commit,当然效率低。
oracle数据库中有对一次批量提交的数据记录数有限制吗?
如果有限制,怎么修改oracle的相关参数?让oracle支持一次性提交的记录数加大一点。
这个系统要插入的数据是第三方系统通过ftp上传到本系统的,并且传来的该文件还包含一些其他信息,比如说版本号,系统号等等。
该文件是要经过我放系统进行解析并进行转存操作的。所以该文件是很不规范的(并不一定满足外部表的一些定义),如果真的要用外部表的话,当我方系统在转存时,那将会生成一个满足一定格式的有利于外部表操作的文件,但我们没有这样做。我们直接解析出文档中要插入的数据进行入库操作。
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
可以试下每10000条左右提交一次,而不需要等到全部插入在提交。
然后批量插入; 也就是几分钟的事。oracle的话, 大约30多分钟吧!