1

我正在尝试创建某个哈希值。遵循以下路径:

  1. 在 $hash 上创建一些具有唯一键的哈希对象
  2. 构造函数填充种子以生成实际的 $hash
  3. 尝试保存它
  4. 如果由于错误 23000(重复键)而导致保存失败,请创建一个不同的哈希并重复,直到创建一个尚不存在的唯一哈希。

现在这是我的问题。使用 Doctrine2,当查询由于 SQL 错误而失败时,它会关闭 EntityManager。就我而言,这没问题,因为我会重试。

一种解决方案是在散列已存在的情况下搜索数据库。由于碰撞(md5)的数量非常非常少,并且需要尽快完成工作(我可以节省的每一毫秒都是值得的),我想跳过检查。

我认为值得一试的另一个解决方案是clone实体管理器。但是,在内部,实体管理器已经传递给内部的对象,它们没有被克隆,而是与引用一起传递。

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

  • 对象 A 获取 EM -> 进行查询
  • 对象 B 获取 EM -> 查询 > 错误 > 创建新的 EM
  • 对象 C 获取 EM -> 使用新 EM 进行查询
  • 对象 A > 确实查询 > 错误,已经关闭,因为在步骤 1 中已经得到它。

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

4

1 回答 1

0

在持久化之前找到一个唯一的哈希怎么样?

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.
于 2013-07-25T12:26:42.190 回答