Doctrine orm Doctrine2,在重复密钥上使用不同的值重试插入

Doctrine orm Doctrine2,在重复密钥上使用不同的值重试插入,doctrine-orm,entity,flush,duplicates,Doctrine Orm,Entity,Flush,Duplicates,我正在尝试创建一个特定的散列。遵循以下路径: 在$hash上创建具有唯一键的哈希对象 构造函数填充种子以生成实际的$hash 试着保存它 如果由于错误23000(重复密钥)而导致保存失败,请创建另一个哈希并重复,直到生成一个尚不存在的唯一哈希 现在我的问题来了。使用Doctrine2,当查询由于SQL错误而失败时,它将关闭EntityManager。在我的情况下,这没有问题,因为我将重试 一种解决方案是在哈希已经存在的情况下搜索数据库。由于非常非常低的冲突量(md5)以及需要尽可能快地完成任务(

我正在尝试创建一个特定的散列。遵循以下路径:

  • 在$hash上创建具有唯一键的哈希对象
  • 构造函数填充种子以生成实际的$hash
  • 试着保存它
  • 如果由于错误23000(重复密钥)而导致保存失败,请创建另一个哈希并重复,直到生成一个尚不存在的唯一哈希
  • 现在我的问题来了。使用Doctrine2,当查询由于SQL错误而失败时,它将关闭EntityManager。在我的情况下,这没有问题,因为我将重试

    一种解决方案是在哈希已经存在的情况下搜索数据库。由于非常非常低的冲突量(md5)以及需要尽可能快地完成任务(我能保存的每一毫秒都是值得的),我想跳过检查

    我认为值得一试的另一个解决方案是克隆实体管理器。但是,在内部,实体管理器已经传递给内部的对象,并且这些对象不是克隆的,而是与引用一起传递的

    第三种解决方案是使用注册表并创建一个新的实体管理器。但是,在此对象之外,我将没有正确的实体管理器:

    • 对象A获取EM->does查询
    • 对象B获取EM->执行查询>错误>创建新EM
    • 对象C获取EM->使用新EM进行查询
    • 对象A>执行查询>错误,已关闭,因为在步骤1中已获取该对象

    我应该怎么做才能快速插入?我需要通过实体来实现,我不打算进行平面DQL/SQL查询。

    在持久化之前找到一个唯一的散列如何

    do {
        $unique_hash = md5(microtime()); // Work out your hash here.
        $existing = $repository->findOneByHash($unique_hash);
        if (!$existing) {
            break; // else carry on until we get one.
        }
    } while (1);
    
    // Use your unique hash here.
    

    这是我当前的实现。然而,正如前面提到的,这太慢了。假设执行此选择需要3毫秒。这意味着超过200000个哈希生成,我的脚本将需要600000毫秒,也就是10分钟。这意味着我的批处理将运行25分钟,而不是每小时运行15分钟。也许可以将所有哈希值放入一个PHP数组,然后使用in_数组(而不是在数据库中一次一个)循环执行该批处理?每次发生冲突时重新打开实体管理器会更慢。