1.背景:
之前写过批量导入百万级数据到mysql的代码,但是局限性比较大,遇到需要复杂校验(重复性校验,有效性校验)的场景下,这种很容易就超时,同时一个系统内,肯定会有多个地方需要用到导入导出,每个地方都写一堆类似的代码,同时还得不断优化性能(数据越来越多,需要越来越复杂),这时候一个管理系统所有导入/导出记录的页面就很实用了,可以让各个模块业务专注在业务上,不需要关心上传和下载。
2.设计:
2.1 常规的导入同步流程如下, 这就引发了一个问题:如果 Excel 的行非常多,或者解析非常复杂,那么解析+校验的过程就非常耗时。如果接口是一个同步的接口,则非常容易出现接口超时,进而返回的校验错误信息也无法展示给前端,这就需要从功能上解决这个问题。
2.2 把同步改为异步,同时引入NFS用来临时存储文件
2.3 导入导出日志记录表设计如下:
CREATE TABLE `t_import_export_records` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`module_name` varchar(32) NOT NULL COMMENT '模块名称',
`file_name` varchar(32) NOT NULL COMMENT '文件名称',
`type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '导入:1;导出:2;',
`state` tinyint(2) NOT NULL DEFAULT '0' COMMENT '进行中:0;成功:1;失败:2;已过期:3',
`nfs_path` varchar(200) DEFAULT NULL COMMENT '文件路径',
`error_reason` text COMMENT '异常日志文件路径',
`expire_time` varchar(32) NOT NULL COMMENT '过期时间,小时',
`start_time` datetime DEFAULT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '开始时间',
`creator` varchar(32) DEFAULT NULL COMMENT '创建人员',
`create_tm` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modifier` varchar(32) DEFAULT NULL COMMENT '修改人员',
`modify_tm` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `creator` (`creator`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='导入导出日志记录表';
2.4 代码实现
从上面的流程中可以看出,每个业务自己只需要实现自己的 数据校验,持久化到db