公司需要将大量数据入库,原本使用mybatis insert数据,但是效率十分低,所以考虑kafka,备用方案sql load。
我是调查sql load方案的,虽然最后没有选择这个方案,但是在这过程中也学习到了很多,在这里总结一下。
我在网上搜到的信息都是类似的,看起来就出自2篇博客,都是入门,对实际操作的帮助不太大。
我这篇包括2个部分,前期调查的概念部分,后期实现的代码部分
参考书:《Oracle Database 11G 数据库管理艺术》
上思维导图
调查
功能
Sql Load是Oracle的数据加载工具,通常用于导入大批量的外部数据。
传统加载和直接加载
SQL Load分为传统加载和直接加载
传统加载:在原理上同insert相同,但是每次提交一组记录,从而提高效率
直接加载:利用数据构造列数组结构,用这些结构来格式化Oracle数据块,然后直接写入数据库表。
传统加载和直接加载的特点和区别都在思维导图里面了,精简的总结一下有这几条
- 直接加载要比传统加载要快,因为不涉及到insert;
- 同传统加载不同,直接加载只会产生少量的日志,这一点在dos执行sqlldr时就有体现,传统加载刷出很多信息
- 直接加载有一定局限性,比较明显的局限就是,
(1). 在执行直接加载时需要保证该表没有锁;
(2). 加载过程中不能修改表结构;
(3). 插入数据时不应用表约束和触发器,将自动禁用所有外部键检查和检查约束,但仍保留非空、唯一和主键约束。(若指定了REENABLE子句,则随着sql load的完成,将自动启用被禁用的约束,否则需要手动开启约束)
(4)若主键重复,会使主键失效,若导入时需要保留主键,建议使用传统装载,或装载前取消主键,删除索引,装载后重建 - 不能使用直接加载的场景(我自己都没遇到,也不太明白这些是啥):
(1). 使用群表
(2). 同时装载父表和子表,嵌套表
(3). 装载VARRAY,BFILE列,对象列
(4). 正在使用ORACLE NET装载
(5). 需要使用sql函数,如果装载大量数据同时需要使用sql函数,则推荐使用外部表或表函数
结构:一般包含4种文件
5. 数据文件:dat、csv、txt --包含待导入的数据,每行映射到数据库中一条记录,包含若干字段值,可包含分隔符便于导入时切割数据
6. 控制文件:ctl --sql load命令
7. 日志文件:log --导入时的日志文件,显示多少正确被导入,多少出问题了没被导入,没导入的数据存到哪个文件里了
8. 问题数据文件:bad --导入时出问题的数据被保存到了这个文件
数据文件
我只试了txt类型的数据文件,我写的生成测试文件的代码能生成的文件的形式如下,以“|”分隔数据,因为数据的长度不固定,所以使用的是