我正在尝试创建某个哈希值。遵循以下路径:
- 在 $hash 上创建一些具有唯一键的哈希对象
- 构造函数填充种子以生成实际的 $hash
- 尝试保存它
- 如果由于错误 23000(重复键)而导致保存失败,请创建一个不同的哈希并重复,直到创建一个尚不存在的唯一哈希。
现在这是我的问题。使用 Doctrine2,当查询由于 SQL 错误而失败时,它会关闭 EntityManager。就我而言,这没问题,因为我会重试。
一种解决方案是在散列已存在的情况下搜索数据库。由于碰撞(md5)的数量非常非常少,并且需要尽快完成工作(我可以节省的每一毫秒都是值得的),我想跳过检查。
我认为值得一试的另一个解决方案是clone
实体管理器。但是,在内部,实体管理器已经传递给内部的对象,它们没有被克隆,而是与引用一起传递。
第三种解决方案是使用注册表并创建一个新的实体管理器。但是,在此对象之外,我将没有正确的实体管理器:
- 对象 A 获取 EM -> 进行查询
- 对象 B 获取 EM -> 查询 > 错误 > 创建新的 EM
- 对象 C 获取 EM -> 使用新 EM 进行查询
- 对象 A > 确实查询 > 错误,已经关闭,因为在步骤 1 中已经得到它。
我应该怎么做才能快速插入?我需要通过实体来完成,我不会进行平面 DQL/SQL 查询。