我要问的问题已经很久了,我认为它问了5-10次。
但我的情况有所不同。
在让许多明智(超过)SO用户复制之前,先阅读我的问题。
我正在我的应用程序中导入包含10K记录的CSV表。
我的逻辑以下列方式工作,
(1)验证&导入表 (2)如果记录不存在,保存到数据库
对工作表的每个记录执行第2步。
在步骤-2中,我必须生成UUID以便稍后识别特定记录,
在我的第一个解决方案中
// this might be unique in some cases
String id = UUID.randomUUID().toString();
但我检查过它确实在每种情况下生成唯一的id,例如 如果我一个接一个地导入10张不同的记录,我得到的都是10次 在每次导入和保存操作中,从数据库重复键错误至少4000次,
这意味着在10,000个密钥生成中,它只生成6000个唯一ID。
然后我生成一个长度为6的字母数字代码,有些像
eSv3h7
并将其附加到先前生成的ID,因此获得以下ID
d545f2b2-63ab-4703-89b0-f2f8eca02154-eSv3h7
经过测试仍然存在id重复的问题。
我也试过这里和其他网站上提到的几种组合,但仍存在同样的id重复问题,
现在我想知道这只发生在循环保存的10k记录中,实际上我需要导入其中有800万条记录的表格
那么如何解决我在特定情况下生成唯一ID的问题?
在你最后尝试这件事。
循环1到10,000 在循环中生成uuid 将它存储在简单的文本文件中
然后制作一个简单的程序来找到它们的副本,如果你在第一次尝试中没有找到任何副本,一遍又一遍地重复上述所有步骤,我相信你会发现重复。
在过去,我也坚信UUID永远不会产生重复的东西,请与我分享您对上述测试的结果。
这是由调用方法'循环保存的工作表的每个记录调用的方法。
@覆盖
public void preSynchronizedServiceExecution(ServiceData sData,
ValueObject valueObject) throws BlfException {
PropertyVO pVO = (PropertyVO) valueObject;
ArrayList<CountyAuctionPropertyVO> capList = pVO
.getCountyAuctionPropertyList();
for (CountyAuctionPropertyVO caVO : capList) {
TadFrameworkUtil.processValueObjectKeyProperty(caVO, true);
TadFrameworkUtil.processValueObjectKeyProperty(caVO
.getPropertyLastOwner(), true);
TadFrameworkUtil.processValueObjectKeyProperty(caVO
.getPropertyLastOwner().getAdd(), true);
}
ArrayList<PropertyAminitiesVO> amList = pVO.getPropertyAminitiesList();
for (PropertyAminitiesVO pamVO : amList) {
TadFrameworkUtil.processValueObjectKeyProperty(pamVO, true);
}
ArrayList<PropertyAttributesVO> atList = pVO
.getPropertyAttributesList();
for (PropertyAttributesVO patVO : atList) {
TadFrameworkUtil.processValueObjectKeyProperty(patVO, true);
}
TadFrameworkUtil.processValueObjectKeyProperty(pVO, true);
TadFrameworkUtil.processValueObjectKeyProperty(pVO.getSiteAdd(), true);
}
以下是id生成方法
public static String generateUUID() throws BlfException {
// this might be unique in some cases
String id = UUID.randomUUID().toString();
// introduce custom random string in mixing of upper and lower
// alphabets,
// which is 6 character long
// and append it to generated GUID.
String rs = randomString(6);
id = id.concat("-").concat(rs);
return id;
}
public static void processValueObjectKeyProperty(ValueObject valueObject,
boolean create) throws BlfException {
String key = (String) BlfConverter.getKey(valueObject);
if (!StringUtility.isStringNonEmpty(key)) {
throw new BlfException(valueObject.getObjectName()
+ "- key property does not exist.");
}
if (create) {
String id = generateUUID();
valueObject.setProperty(key, id);
} else {
String exisitingId = valueObject.getProperty(key);
if (!StringUtility.isStringNonEmpty(exisitingId)) {
String id = generateUUID();
valueObject.setProperty(key, id);
}
}
}
随机字符串方法只是2行的简单方法,它生成长度为6的字母数字随机字符串。
请问我是否还需要更多信息,以便我可以在这里发帖。
d545f2b2-63ab-4703-89b0-f2f8eca02154-eSv3h7
6f06fa28-6f36-4ed4-926b-9fef86d002b3-DZ2LaE
20142d05-f456-4d72-b845-b6819443b480-xzypQr
67b2a353-e7b4-4245-90a0-e9fca8644713-AgSQZm
8213b275-2cb1-4d37-aff0-316a47e5b780-vMIwv9
如果我需要从那里获取它,我将从数据库中获得准确的结果。
由于
答案 0 :(得分:0)
感谢所有认真研究我的问题的用户,并花了一些时间帮助我解决问题。
我发现错误发生在业务逻辑基础的数据库层中。
其中一个Object需要更新,但它是使用previous创建的 现有的ID,以便我得到重复的主键错误。
我开发了一个用于id生成的单元测试,并测试了UUID 十亿个关键,它保证是独一无二的,它确实是真的 情况。
再次感谢大家。