JDBC操作数据库报 Duplicate entry

cqfuqq 2019-05-29 原文

JDBC操作数据库报 Duplicate entry

现象:

  在日常开发中经常使用jdbc直连数据库操作,难免会遇到 Duplicate entry的错误。先直接说问题原因:

     1. 绝大多数情况下该错误是由于重复插入导致的

     2. 数据库外键约束创建不当引起

场景:

  结合楼主在实际开发中遇到的问题简单说一下,系统采用canal监听binlog源源不断的将增量数据使用jdbc保存至数据库,事件类型包括增删改,采用多线程并行处理数据。

  在实际场景中,楼主遇到程序不断的刷 Duplicate entry,起初以为是canal在重启后会回溯一段binlog导致的重复消费,可是等了好久还在刷,意识到这肯定是代码的bug了。

  最终找到了原因所在: 对每一个事件进行解析并拼接sql,如果是连续insert则采取批量处理,然后将sql信息缓存到当前线程的ThreadLocal中,然后入库,乍一看没啥问题,毕竟ThreadLocal为新开启一个线程单独分配副本,那问题出在哪里呢?最终发现代码使用了                                              线 程池技术,也就是说一个线程用完后不会立马关闭,会被回收等待下次使用,当两条连续的业务数据公用一个线程时就出问题了,后面的业务线会把上一条业务线的数据重复消费,重温导致了不断刷 Duplicate entry 的错误。解决办法就是                                               每次业务处理完成清空ThreadLocal缓存。

  到这儿还没结束,经过上面的额修改确实异常数量降低了不少,可是还是在报 Duplicate entry 的错误,只不过是偶尔出现。最终发现是数据库中某张表设置了外键,把外键取消掉就好了

 

总结:

  1. 每条业务线处理完清楚当前线程的ThreadLocal缓存

  2. 每条insert语句加上 ignore,例如 insert ignore into t….

  3. 数据库层面删除不合理的外键约束

  

  

posted on 2019-05-29 10:44 cq_fuqq 阅读() 评论() 编辑 收藏

 

 
版权声明:本文为cqfuqq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cqfuqq/p/10942364.html

JDBC操作数据库报 Duplicate entry的更多相关文章

  1. Spring异常之版本错误

    今天开始一个新项目的开发,结果使用maven刚刚部署完环境,一启动立马报错 1 java.lang.NoSuc […]...

随机推荐

  1. SVN使用教程

    概要 概述         SAE自2011-7-10日起,将全面支持SVN代码部署,用户不仅可以通过任何SV […]...

  2. 交互的量化分析[四]

    上一篇文章中,我们讨论了量度任务的方法: http://www.cnblogs.com/windyao/arc […]...

  3. webpack(1)安装环境与解决环境问题

    前言 如果我们需要使用webpack,就需要依赖node环境 nvm node npm webpack@cli […]...

  4. 透视中外交流中的“三倍差”现象

    透视中外交流中的“三倍差”现象 Posted on 2018-03-12 14:33 中科院王飞跃 阅读(&# […]...

  5. Cortex-M3开发经验(三):在HardFault中打印栈信息

    Cortex-M3开发经验(三):在HardFault中打印栈信息 在《Cortex-M3开发经验(二):确认 […]...

  6. Java入门系列-23-NIO(使用缓冲区和通道对文件操作)

    NIO 是什么 java.nio全称java non-blocking(非阻塞) IO(实际上是 new io […]...

  7. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务。其中一个模块是用Golang编写的,负责对iOS崩 […]...

  8. 教你如何将 优酷网等视频网站的视频外链时自动播放

    优酷网(YOUKU.com)是中国领先的视频分享网站,是国内网络视频行业的第一品牌。优酷网以 “快者为王”为产 […]...

展开目录

目录导航