Mysql Springboot+JPA:catch DataIntegrityViolationException vs check COUNT(字段)

Mysql Springboot+JPA:catch DataIntegrityViolationException vs check COUNT(字段),mysql,spring-boot,spring-data-jpa,Mysql,Spring Boot,Spring Data Jpa,早上好 我正在创建一个新用户,它的电子邮件必须是唯一的。我已经在用户实体中声明了它 我想知道在DB中创建用户时捕获DataIntegrityViolationException是否更快/最佳做法,或者检查用户是否存在是否更好:从用户u中选择count*,其中u.email=?比如说 我在SpringBoot中工作,使用MySQL和JPA 非常感谢你 在这种情况下,性能差异可能非常小 这里最重要的是通过阅读代码来理解发生了什么。在您的服务层中应该有一些代码,在实际尝试在databaase中处理之前

早上好

我正在创建一个新用户,它的电子邮件必须是唯一的。我已经在用户实体中声明了它

我想知道在DB中创建用户时捕获DataIntegrityViolationException是否更快/最佳做法,或者检查用户是否存在是否更好:从用户u中选择count*,其中u.email=?比如说

我在SpringBoot中工作,使用MySQL和JPA


非常感谢你

在这种情况下,性能差异可能非常小

这里最重要的是通过阅读代码来理解发生了什么。在您的服务层中应该有一些代码,在实际尝试在databaase中处理之前检查定义的每个规则是否被违反。对于新来者,甚至对你来说,在几周内对测试内容和测试方式有一个清晰的认识会更容易

然后,代码的这一部分会引发一个带有专用代码的异常。例如,让我们以业务分析师定义的业务规则的ID为例,在属性中,您应该有一条与该规则对应的消息。例如,消息键可以是规则的ID


此外,在该表中插入行时,您可能会出于不同的原因获得DataIntegrityViolationException。因此,无论如何,这不是一个持久的解决方案。

在数据库引发异常之前,业务逻辑应该处理这个问题,因此我建议检查emailId是否已经存在,如果已经存在,请发送正确的响应,否则请插入user@Avi是的,但问题是:检查是否更有效,如果不存在,则创建用户,或者尝试直接创建它并处理该异常?这就是我所指的。前逻辑或后处理效率。我明白,简单地说。。。。执行1个查询是否优于2个查询,反之亦然?问题是什么?是的,运行1查询是有效的,但不要忽略可能影响代码质量的过度优化。不客气。此外,为了检查是否存在某些数据,不必计算与条件匹配的所有行,通常在找到与条件匹配的第一行时停止搜索会更有效。这可以通过将查询的maxResults属性设置为1来实现,这正是Spring数据在使用existsBy*派生查询方法时所做的。