IdType.ID_WORKER_STR会自动插入ID吗
时间: 2023-10-01 11:07:15 浏览: 87
IdType.ID_WORKER_STR 是一种基于Snowflake算法生成的唯一ID,它是一个字符串类型的ID。它不会自动插入ID,您需要显式调用ID生成器方法来获得一个ID。这个ID的生成过程是非常简单的,它的组成部分包括时间戳、数据中心ID、机器ID和序列号,并且可以根据您的需求进行自定义配置。
相关问题
为什么我设置了type = IdType.ID_WORKER_STR,还会出现Duplicate entry '1680128727478001666' for key 'edu_subject.PRIMARY'的问题
这个问题可能是由于以下几种情况引起的:
1. 数据库中已经存在了重复的主键值。在使用ID_WORKER_STR类型时,主键值是由Snowflake算法生成的,具有一定的唯一性。如果数据库中已经存在相同的主键值,就会出现重复键的错误。
2. 数据库表中设置的主键字段长度不足以存储ID_WORKER_STR生成的主键值。ID_WORKER_STR生成的主键值是一个字符串,其长度可能很长。如果数据库表中设置的主键字段长度不足以存储整个主键值,就会截断部分主键值导致重复键错误。
为了解决这个问题,你可以尝试以下几个步骤:
1. 检查数据库表中是否存在重复的主键值。可以通过查询数据库表来查找是否存在相同的主键值,并进行删除或修改。
2. 检查数据库表中主键字段的长度是否足够存储ID_WORKER_STR生成的主键值。如果长度不够,可以考虑扩展字段长度或者修改主键生成策略。
3. 确保在插入数据时,使用了正确的主键生成策略和算法。可以检查代码中的相关配置和使用方式是否正确。
希望以上信息对你有帮助!如果还有其他问题,请随时提问。
void S1mmeSession::CtEncodeKqi(S1MMEKQI* kqi, S1APNode* p_node, uint8_t worker_id) { MsgCommonInfo& common = p_node->GetCommonInfo(); SPUserInfo& sp_user_info = p_node->GetUserInfo(); //获取 buf TlvEncoder* p_encoder_cur = g_p_encoder_[worker_id]; YdCDR_T* p_dst_data = (YdCDR_T*)malloc(sizeof(YdCDR_T)); if (p_dst_data == NULL) { return; } p_dst_data->not_associate = 0; if ((common.not_associate & 0x03) == 0x03) p_dst_data->not_associate = 1; p_encoder_cur->Set(p_dst_data->cdr_data,kMaxOneCdrBufLen); uint64_t imsi = sp_user_info->GetIMSI(); if(common.eci == 0) { common.eci = sp_user_info->GetEci(); } uint16_t tmp_enbid = common.tac;//>>8; //uint32_t tmp_enbid = (common.eci >> 8)&0xfffff; char xdrid_str[32]={0}; #ifdef OPEN_NEW_HUISU convert_xdrid_to_string(xdrid_str, kqi->xdrid, s_xdr_id_len); #else #ifdef OPENCTPR g4sigtran::pr::ProcBlock* p_blk = kqi->binary_block_in_xdr_.GetBlock(); p_blk->SerializeXid(xdrid_str, sizeof(xdrid_str)); #else uint64_t subcdrid = g_ct_xdr_id.GetXid(); //reverse subend; if(::is_open_reverse) { SetReverseSubend(p_node, subcdrid); } #ifdef ONE_THIRD_YUNNAN_MRO g_ct_xdr_id.Serialize((uint8_t*)xdrid_str, s_xdr_id_len, imsi); #else g_ct_xdr_id.Serialize((uint8_t*)xdrid_str, s_xdr_id_len); #endif #endif #endif struct timespec start_time = kqi->request_time_, end_time = kqi->response_time_; if (kqi->request_time_.tv_sec == 0) { if (!(kqi->response_time_.tv_sec == 0)) { start_time = kqi->response_time_; } else if (!(kqi->complete_time_.tv_sec == 0)) { start_time = kqi->complete_time_; } } if (!(kqi->complete_time_.tv_sec == 0)) { end_time = kqi->complete_time_; } if (end_time.tv_sec == 0) { end_time = start_time; } p_encoder_cur->SetHdr(kEncoderCdr, kqi->kqi_type_, current_time_.tv_sec, worker_id);在S1mmeSession::CtEncodeKqi函数最后面加一个函数,来维护一组key、value的关系。 key:imsi value:imsi、imei、common.eci、common.tac、last_time 要求,imsi相同时,以最后一条记录的value内容为准进行保存。
好的,你的问题是如何在S1mmeSession::CtEncodeKqi函数中实现一组key-value的关系维护,要求imsi相同时以最后一条记录的value内容为准进行保存。
可以使用一个std::unordered_map来保存key-value的关系,其中key为imsi,value为一个结构体,包含imsi、imei、common.eci、common.tac和last_time等字段。在每次调用CtEncodeKqi函数时,先检查该imsi是否已经在unordered_map中存在,如果存在,则更新该imsi对应的value内容,否则新建一个value并插入到unordered_map中。最后要更新last_time字段为当前时间。在获取value内容时,可以直接从unordered_map中通过key查找对应的value。
阅读全文