场景:导入会员数据,出现了重复数据在库里面。导入过程中有身份证号的唯一检查,怎么还会重复呢。百思不得其解。。。

万恶的网络延迟。。。。

仔细查了遍代码,发现身份证号检查速度特别慢,造成了网络阻塞。。。

对于用户来说不知道怎么回事(以为没反应),点击了导入。。。两个线程之间几乎没有时间差。所以即使有检查,也没管用。

解决案

1.优化身份证号的检查,并在表中为身份证号加索引

2.mybatis上做的手脚,重复时候不插入。

  • 1.如果某些关键字段已经在Mysql中存在了,不要重复插入,而是改为更新某些字段。
  • 2.如果某些关键字段已经在Mysql中存在了,不要重复插入,也不需要做更新操作,直接忽略即可。

1、针对上面的第一种,mysql提供了insert into ... on duplicate key update ... 语法(Mysql自己的语法,不属于标准SQL)来实现。这种场景相对常见。使用的前提是,需要定义主键或者           唯一性索引,用来告诉Mysql哪些字段的重复会造成主键冲突或者违背唯一性约束条件。当这些情况出现时,就放弃insert操作,转而执行后面的update操作。上一个具体的例子,在ibatis           中写的一个上面逻辑的sql:

Xml代码  
  1. <statement id="testInsertOnDuplicateKeyUpdate"
  2. parameterClass="com.alibaba.ais.bdc.person.dataobject.UserInfo">
  3. <!--Here the employ_id has been defined as a primary key-->
  4. insert into T_USER_INFO (employ_id,fans_count,follow_count)
  5. values (#employId#,#fansCount#,#followCount#)
  6. ON DUPLICATE KEY UPDATE follow_countfollow_count=follow_count+1
  7. </statement>

上面的插入操作就会在employ_id发生主键冲突的时候,转变为更新follow_count字段(自增一个单位)。

2、针对上面的第二种,mysql提供了insert ignore into ... 语法(Mysql自己的语法,不属于标准SQL)来实现。这种场景相对要少见一些。 使用的前提是,需要定义主键或者唯一性索引,原因同上面一致。但不同的就是,违背唯一性约束时,直接忽略这次insert操作,然后啥也不干了,也不会报错。。。

但这里有个问题,就是有时业务本身还是需要知道语句到底执行了insert还是没有执行!因为需要根据这个反馈信息,做出不同的处理逻辑。这里给出使用ibatis时,两种不同的处理方法。

  • 借助mysql的内置函数row_count()和ibatis的selectKey标签:

    • 关于ibatis的selectKey标签,更为常见的用法是在插入对象到DB之后,返回DB自增产生的主键ID。比如:

      • Xml代码  
        1. <insert id="testSelectKey">
        2. insert into T_TEST(WATCHER, WATCHEE) values (#watcher#,#watchee#)
        3. <selectKey resultClass="int" keyProperty="id">
        4. select last_insert_id() as ID from dependency limit 1
        5. </selectKey>
        6. lt;/insert>
      • 通过上面语句进行插入操作之后,可以通过如下方式在Java代码中获得这个DB自增产生的ID:
      • Java代码  
        1. Integer id = (Integer) sqlMapClient.insert("testSelectKey", param);
    • row_count()是Mysql提供可以获得insert、update、delete这几种操作成功处理行数的一个内置函数,有了这个函数,再结合上面给出的selectKey标签的例子,就可以做到获得insert ignore时,成功insert的行数。有了这个行数,也就知道了到底有没有发生insert操作。(发生了插入操作该函数返回值会大于0),于是改编一下上面的sql-map中的sql(注意其中的ignore关键字):
      • Xml代码  
        1. <insert id="testInsertIgnore">
        2. insert ignore into T_TEST(WATCHER, WATCHEE) values (#watcher#,#watchee#)
        3. <selectKey resultClass="int" keyProperty="id">
        4. select row_count() as ID from T_USER_RELATION limit 1
        5. </selectKey>
        6. lt;/insert>

        通过上面语句进行插入操作之后,可以通过如下方式在Java代码中获得insert真正影响到的行数:

      • Java代码  
        1. Integer affectedRows = (Integer)sqlMapClient.insert("testInsertIgnore", param);
  • 利用ibatis的update语句:上面之所以要费劲周折的修改insert语句,时因为ibatis本身的insert不是默认支持返回影响的行数的。但是update语句支持!于是,另外一个思路,就是利用update语句来完成这个insert操作。
    • Xml代码  
      1. <update id="testInsertIgnore">
      2. insert ignore into T_USER_RELATION(WATCHER, WATCHEE) values (#watcher#,#watchee#)
      3. <!--Without selectKey tag, it looks mush more concise-->
      4. </update>

      通过上面语句进行插入操作之后,可以通过如下方式在Java代码中获得insert真正影响到的行数(这里需要注意的是,Java代码中需要使用sqlMapClient的update的API哦):

    • Java代码  
      1. Integer affectedRows = (Integer)sqlMapClient.update("testInsertIgnore", param);

教训:可能开发人员为了省事,喜欢共用sql文。但是一个小小的检查其实是不需要关联那么多表的。共用后,导致检查时间过慢。

          特别是表数据量较大的时候非常明显。建议,新写个检查的sql

转载于:https://www.cnblogs.com/taiyanhong/p/7249393.html

因网络延迟造成数据库插入相同记录,如何解决.相关推荐

  1. 网络丢包,网络延迟?这款神器帮你解决所有

    常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合ping nslookup traceroute 来判 ...

  2. MySQL数据库篇---对数据库,数据库中表,数据库中表的记录进行添修删查操作---保姆级教程

    MySQL数据库知识点整理,保姆级教程 MySQL数据库存储方式 sql简介 SQL分类 DDL: 数据定义语言 DCL: 数据控制语言 DML:数据操控语言 DQL: 数据查询语言 SQL的使用 S ...

  3. mysql数据库加载太慢_mysql千万级数据库插入速度和读取速度的调整记录

    一般情况下mysql上百万数据读取和插入更新是没什么问题了,但到了上千万级就会出现很慢,下面我们来看mysql千万级数据库插入速度和读取速度的调整记录吧. (1)提高数据库插入性能中心思想:尽量将数据 ...

  4. 成功解决:利用编程向数据库插入一条记录,而从数据库中查不到该条记录

    成功解决:利用编程向数据库插入一条记录,而从数据库中查不到该条记录 目录 解决问题 解决方法 1.首先查看是否有conn.commit() 2.继续判断 解决问题 利用编程向数据库插入一条记录,而从数 ...

  5. Java数据库插入记录的语句-单引号-双引号values('username+'-'+password

    数据库插入记录的语句,单引号,双引号values('"+username+"','"+password+ 我们来看这条语句 cmd.CommandText = " ...

  6. Mysql数据库中插入记录的命令_向数据库中添加记录的sql命令是什么

    向数据库中添加记录的sql命令是INSERT INTO. (推荐学习:mysql教程) INSERT INTO 语句的语法 INSERT INTO 语句可以有两种编写形式,分别是: 第一种形式 无需指 ...

  7. mysql千万级数据库插入速度和读取速度的调整记录。

    (1)提高数据库插入性能中心思想:尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作.这次修改了下面四个配置项:           1)将 innodb_flush_l ...

  8. 高并发 数据库操作比如插入,修改等解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 一般没有办法就是直接操作 数据库了,所以才 需要分布式mysq等,必须有事务. 但是如何并发太大还是不够的, 解决方案: 原子 ...

  9. 数据有序_详解数据库插入性能优化:合并+事务+有序数据进行INSERT操作

    概述 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意 ...

最新文章

  1. 第十篇学会编写python代码_Python之路,第十篇:Python入门与基础10
  2. BizTalk 2006 简单入门示例程序(附源项目文件下载)
  3. Android网络之数据解析----SAX方式解析XML数据
  4. JAVA实现查看详情功能_【JavaWeb】111:详情页面的实现
  5. android 美颜,「照骗」要消失了?Android 11 或禁用自动美颜
  6. Java中therad_java中Thread的深入了解(一)
  7. python modbus控制plc_python Modbus基础
  8. 4.微服务设计 --- 集成
  9. 爬虫入门—网页信息爬取
  10. 抽奖活动软件 html,APP怎么制作抽奖活动,制作APP抽奖活动有何亮点
  11. Android studio 下载安装
  12. MySQL数据表字段繁体转简体
  13. 深度学习名词(中英文对照)
  14. 手机取证设备(手机点验设备、手机合规检测、双路并行手机取证深度分析系统、手机点验数据恢复)
  15. java生成统计图_java生成各种统计图
  16. 天空盒六面图片+左右眼3D全景图片
  17. 从零教你用抖音赚钱——吸粉变现技巧
  18. ARM系统下使用Vdbench测试存储性能
  19. 基于MATLAB的FIR滤波器的设计及应用(图像去噪)
  20. 【嵌入式05】Ubuntu下opencv新手操作:(打开图片及视频)

热门文章

  1. 微信群聊小机器人的服务器,微信群里自动聊天的机器人是怎么弄的?有没有操作教程?...
  2. 你为什么被拒?盘点面试失败的3大原因
  3. powerbi服务器打开文件慢,Power BI 优化指南
  4. 边沿触发 与电平触发
  5. 盛大哼唱检索前端提取算法分析
  6. cf各区服务器所在位置,为什么说“黑区”是CF第一服务器
  7. 大数据Kudu使用方法
  8. 数学(零)零散知识点
  9. The error may exist in /com/bjpowernode/dao/StudentDao.xml ### Cause: org.apache.ibatis.builder.Buil
  10. 英文会议论文出版地信息汇总