(T) obj;
View Code
同样,也有必要对里面的taskManager#getById、以及读的其他基础数据做缓存,以减小数据库开销,提高响应。
【附】DuplicateKeyException异常的详细信息
2021-08-05 11:39:34.977[] [] [TaskApplyServiceImpl_save1628134774972] ERROR c.e.b.m.taskapply.provider.TaskApplyServiceImpl:626 - 添加任务领取单失败,VO:TaskApplyVO(applyId=1628134774972873, userId=2498481, taskId=1623981559337834, applyStatus=TASKAPPLY_PASS, applyTime=Thu Aug 05 11:39:34 CST 2021, enterpriseId=1612700449967926, userName=何*利, userMobile=152****274, idCardNo=341******180, receiveBankNo=null, enterpriseName=车车****江苏分司, providerName=山东瑞***有限公司, providerId=31720, taskName=信息服务),异常:
org.springframework.dao.DuplicateKeyException:
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1623981559337834-TASKAPPLY_PASS-4F310E302A059B140D26BE4BB2DFF192' for key 'task_apply_unique_2'
关于里面的entry值 '1623981559337834-TASKAPPLY_PASS-4F310E302A059B140D26BE4BB2DFF192', mysql会针对索引涉及到的字段为索引定义一个值。
先贴上task_apply表DDL语句,其中有联合唯一索引task_apply_unique_2。
CREATE TABLE `task_apply` (
`apply_id` bigint(20) NOT NULL COMMENT '任务领取单号',
`user_id` bigint(20) DEFAULT NULL COMMENT '人员编号',
`task_id` bigint(20) DEFAULT NULL COMMENT '任务编号',
`apply_status` varchar(30) DEFAULT NULL COMMENT '领取状态 TASKAPPLY_UNCLAIMED:待领取,TASKAPPLY_AUDITED:待审核,TASKAPPLY_PASS:审核通过,TASKAPPLY_REFUSE:审核拒绝',
`apply_time` datetime DEFAULT NULL COMMENT '领取时间',
`enterprise_id` bigint(20) DEFAULT NULL COMMENT '企业编号',
`audit_time` datetime DEFAULT NULL COMMENT '企业审核时间',
`id_card_no` varchar(128) DEFAULT NULL,
`provider_name` varchar(64) DEFAULT NULL COMMENT '服务商名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` varchar(255) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`update_by` varchar(255) DEFAULT NULL COMMENT '修改人',
`task_name` varchar(64) DEFAULT NULL COMMENT '任务名称',
`provider_id` bigint(20) DEFAULT NULL COMMENT '服务商ID',
PRIMARY KEY (`apply_id`) USING BTREE,
UNIQUE KEY `task_apply_unique_2` (`task_id`,`apply_status`,`id_card_no`,`enterprise_id`,`provider_id`,`user_id`),
KEY `user_id_index` (`user_id`),
KEY `enterprise_id_and_provider_id` (`enterprise_id`,`provider_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='任务领取表';
View Code
如下是测试Duplicate entry .. for key ..
INSERT INTO `emax_task_apply` VALUES (1417422528648880129, 1626774839350848, 1626773826894100, 'TASKAPPLY_PASS', '2021-07-20 17:57:03', 1626769691952966, NULL, NULL, '史千龙', '12300000000', '130432200002150319', '【生产测试】-bosskg(二期)', '品牌宣传', '网络直播', '青岛德瑞信息科技有限公司', '2021-07-20 17:54:00', '12300000000', '2021-07-20 17:57:03', '12300000000', '【生产测试】- 2.0', 30481)
1062 - Duplicate entry '1417422528648880129' for key 'PRIMARY'
INSERT INTO `emax_task_apply` VALUES (141742252864888012, 1626774839350848, 1626773826894100, 'TASKAPPLY_PASS', '2021-07-20 17:57:03', 1626769691952966, NULL, NULL, '史千龙', '12300000000', '130432200002150319', '【生产测试】-bosskg(二期)', '品牌宣传', '网络直播', '青岛德瑞信息科技有限公司', '2021-07-20 17:54:00', '12300000000', '2021-07-20 17:57:03', '12300000000', '【生产测试】- 2.0', 30481)
1062 - Duplicate entry '1626773826894100-TASKAPPLY_PASS-130432200002150319-1626769691952' for key 'task_apply_unique_2'
INSERT INTO `emax_task_apply` VALUES (14174225286488802, 66, 11, '22TASKAPPLY_PASS', '2021-07-20 17:57:03', 44, NULL, NULL, '史千龙', '12300000000', '33', '【生产测试】-bosskg(二期)', '品牌宣传', '网络直播', '青岛德瑞信息科技有限公司', '2021-07-20 17:54:00', '12300000000', '2021-07-20 17:57:03', '12300000000', '【生产测试】- 2.0', 55)
1062 - Duplicate entry '11-22TASKAPPLY_PASS-33-44-55-66' for key 'task_apply_unique_2'
看来,① mysql主键值直接是主键字段的值,比如'1417422528648880129';② 联合索引的情况下,当每个索引字段的值比较短的时候,mysql是拼起来的,比如 '11-22TASKAPPLY_PASS-33-44-55-66' ;③ 而当每个索引字段的值比较长的时候,mysql做了处理了,比如 '1626773826894100-TASKAPPLY_PASS-130432200002150319-1626769691952' 和'1623981559337834-TASKAPPLY_PASS-4F310E302A059B140D26BE4BB2DFF192'。
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/15113553.html