java duplicate entry_java向数据库插入数据时的错误: Duplicate entry '' for key 'PRIMARY' 问题解决...

错误提示为:你插入的记录与数据表中原有记录的主键重复了(Duplicate)。所以插入失败

mysql主键设置成auto_increment时,进行并发性能测试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'

解决方法:

在my.cnf的[mysqld]片段中加入设置innodb_autoinc_lock_mode=0

同一时候注意调大jdbc的活跃链接数,如设置 jdbc.maxActive=300,由于设置innodb_autoinc_lock_mode=0可能导致链接过多。

注意,这样的方式仅仅须要在并发性能测试时设置,由于这样的方式在插入记录时需进行全表锁定,性能较差,平时生产环境中仅仅需使用默认的设置innodb_autoinc_lock_mode=1就可以,mysql的官方文档有说明:

1、innodb_autoinc_lock_mode = 0 (“traditional” lock mode)

这样的方式就和mysql5.1.22曾经一样,这样的方式的特点就是“表级锁定”,并发性较差

2、innodb_autoinc_lock_mode = 1 (“consecutive” lock mode)

这样的方式是新版本号中的默认方式,推荐使用,并发性相对较高,特点是“consecutive”,即保证同一条insert语句中新插入的auto_increment id都是连续的。

这样的模式下:

“Simple inserts”:直接通过分析语句,获得要插入的数量,然后一次性分配足够的auto_increment id,仅仅会将整个分配的过程锁住。

“Bulk inserts”:由于不能确定插入的数量,因此使用和曾经的模式同样的表级锁定。

“Mixed-mode inserts”:直接分析语句,获得最坏情况下须要插入的数量,然后一次性分配足够的auto_increment id,仅仅会将整个分配的过程锁住。须要注意的是,这样的方式下,会分配过多的id,而导致”浪费“。比方INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');会一次性的分配5个id,而无论用户是否指定了部分id;INSERT … ON DUPLICATE KEY UPDATE一次性分配,而无论将来插入过程中是否会由于duplicate key而只运行update操作。

注意:当master mysql版本号<5.1.22,slave mysql版本号>=5.1.22时,slave须要将innodb_autoinc_lock_mode设置为0,由于默认的 innodb_autoinc_lock_mode为1,对于INSERT … ON DUPLICATE KEY UPDATE和INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');的运行结果不同,现实环境通常会使用INSERT … ON DUPLICATE KEY UPDATE。

3、innodb_autoinc_lock_mode = 2 (“interleaved” lock mode)

这样的模式是来一个分配一个,而不会锁表,仅仅会锁住分配id的过程,和innodb_autoinc_lock_mode = 1的差别在于,不会预分配多个,这样的方式并发性最高。可是在replication中当binlog_format为statement-based时 (简称SBR statement-based replication)存在问题,由于是来一个分配一个,这样当并发运行时,“Bulk inserts”在分配的时会同一时候向其它的INSERT分配,会出现主从不一致(从库运行结果和主库运行结果不一样),由于binlog仅仅会记录开始的 insert id。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:返回到login页面的url为http://localhost:8080/register?userName=%E8%B5%B5%E5%85%AD&identityCode=456795555225452&email=457698826%40qq.com&mobile=1550000&gender=0&loginName=six&password=,这项目又将数据存储了一遍造成了数据重复。引用\[2\]:Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'x_mu.PRIMARY' 问题:为什么会出现"Duplicate entry '1' for key 'x_mu.PRIMARY'"的错误? 回答: 这个错误是由于数据库中的唯一键约束引起的。在给数据库插入数据,如果插入数据与已有数据的唯一键冲突,就会出现这个错误。在你提供的引用中,可以看到在返回到login页面,项目又将数据存储了一遍,导致了数据的重复。而数据库中的唯一键约束要求每条记录的唯一键值都是唯一的,因此当插入重复的唯一键值,就会出现"Duplicate entry '1' for key 'x_mu.PRIMARY'"的错误。这个错误提示中的'1'是指重复的唯一键值,'x_mu.PRIMARY'是指唯一键的名称。 #### 引用[.reference_title] - *1* [Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘‘six‘ for key ‘user_...](https://blog.csdn.net/m0_52163608/article/details/119719084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值