在非常大的循环中生成唯一标识符 - Java

时间:2013-12-25 07:20:01

标签: java

我要问的问题已经很久了,我认为它问了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 - 基于所有评论

在你最后尝试这件事。

循环1到10,000 在循环中生成uuid 将它存储在简单的文本文件中

然后制作一个简单的程序来找到它们的副本,如果你在第一次尝试中没有找到任何副本,一遍又一遍地重复上述所有步骤,我相信你会发现重复。

在过去,我也坚信UUID永远不会产生重复的东西,请与我分享您对上述测试的结果。

更新2 - 代码

这是由调用方法'循环保存的工作表的每个记录调用的方法。

@覆盖

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;
    }

更新3(添加方法)

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的字母数字随机字符串。

请问我是否还需要更多信息,以便我可以在这里发帖。

更新4(样本生成的UUID)

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

如果我需要从那里获取它,我将从数据库中获得准确的结果。

由于

1 个答案:

答案 0 :(得分:0)

感谢所有认真研究我的问题的用户,并花了一些时间帮助我解决问题。

我发现错误发生在业务逻辑基础的数据库层中。

  

其中一个Object需要更新,但它是使用previous创建的   现有的ID,以便我得到重复的主键错误。

     

我开发了一个用于id生成的单元测试,并测试了UUID   十亿个关键,它保证是独一无二的,它确实是真的   情况。

再次感谢大家。