Spring Excel批量导入时主键唯一的判断如何解决
目前在做SpringMVC的项目,集合POI包实现Excel数据导入的功能。但数据导入时,有主键列,数据库中肯定是唯一的。我采用的方式是当批量插入数据库时,依赖Spring的主键重复异常,来提示用户导入失败,同时事务回滚。
现在想在发现主键重复时,可以具体提示用户具体是哪条数据引起了问题。求教有没有好的办法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
是使用业务主键处理数据的。我这儿是上传文件后批量插入的,如果判断重复的进行更新的话,那么只能循环里做判断了吧?感觉这样做性能不太好。我可以想到的是,可以把循环里判断这步做成存储过程,但Mysql不支持集合的类型,所以感觉操作也是不便。
回复
可以按照主键是否存在把数据分割为insert跟update然后用批量语句执行. 结束以后告诉用户新增多少条,更新多少条.总共多少条.
导入还带主键?
用业务主键处理数据么?
重复不能做更新操作么?
把每行的主键放到map里面,读一行就判断一下是否有这个key,有就告诉用户是哪行重复了,没有就放到map里。笨方法。
其实可以直接在excel后面加一个标识列,然后导入的时候首先进行验证,如果验证不过就在标识列进行着色,最后要进行事务回滚。。
谢谢你的经验分享。其实我这儿的导入操作频率应该是很低的,而且导入的excel文件也限定数据不能超过2000条,我个人认为数据量不大。担心的一点就是如果有几个人同时导入时,而且每人导入的数据量都将近2000的话,怕内存中一次性生成大量的对象,产生内存溢出。
回复
一次 2000,频率很低,这点数据,对数据库来说不算什么
回复
不用这么客气的,我记得我之前导入5W条时好像内存溢出了,然后又重新写的,2K条的话肯定不是问题,至于多线程的问题一直都是程序的难点,这个确实得根据具体情况分析。
我之前有做过类似导入的功能,数据量也蛮大的,当时的处理方式是在进行批量导入之前进行判断是否数据库中已经存在,当然这样的方式是比较耗时,但是这样的好处是:1、问题统一返回:可以判处出哪些数据有问题然后一并通知用户而不是修改完一条发现后面还有问题。2、出错程序不执行事务:当数据出现问题时不执行事务直接返回错误信息,而不是执行之后再回滚事务,这样做的好处就不多说了!具体如何设计,还要总体衡量。
请问验证数据那一步,是需要先查询业务表中已存在的记录吧,然后在比对中间表中的数据,如果是这样的话,数量大时这一步是相当耗时的吧?
回复
数据量导致的性能问题可以另想办法解决。中间表是做数据接口比较常用的做法。
1. 临时建一个中间表,字段为:id + excel 中的所有字段 + 存放验证结果的字段
2. 把数据插入中间表
3. 验证数据,成功就插入业务表,失败就提示用户