【问题标题】:Springboot + JPA: catch DataIntegrityViolationException vs check COUNT(field)Spring Boot + JPA:捕获 DataIntegrityViolationException 与检查 COUNT(field)
【发布时间】:2020-05-21 10:32:38
【问题描述】:

早上好,

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

我想知道在数据库中创建用户时捕获 DataIntegrityViolationException 是否更好(更快/最佳实践),或者检查用户是否存在更好:select count(*) from User u where u.email=?例如。

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

非常感谢!!

【问题讨论】:

  • 业务逻辑应该在数据库抛出异常之前处理这个问题,所以我建议检查emailId是否已经存在,如果存在则发送正确的响应,否则插入用户
  • @Avi 是的,但关键是:检查是否更有效,如果不存在则创建用户,还是尝试直接创建并处理该异常?这就是我要指出的。前逻辑或后处理效率。
  • 我明白简单来说还可以......执行 1 个查询优于 2 个查询,反之亦然?是什么问题,是的,运行 1 个查询是有效的,但不要忽视可能影响代码质量的过度优化

标签: mysql spring-boot spring-data-jpa


【解决方案1】:

在这种情况下,性能差异可能非常微不足道。

这里最重要的是通过阅读代码来了解发生了什么。您应该在服务层中有一些代码,在实际尝试在数据库中继续之前检查定义的每个规则都没有被违反。 IT 将更容易让新来的人(甚至在几周内为您)清楚地了解测试的内容和方式。

然后,该部分代码应该使用专用代码引发异常(例如,让我们获取业务分析师定义的业务规则的 ID),并且在属性中,您应该有一条与该规则相对应的消息(例如,消息键可以是规则的 id)。

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

【讨论】:

  • 不客气。此外,要检查某些数据是否存在,而不是计算与您的条件匹配的所有行,通常在找到与条件匹配的第一行时停止搜索会更有效。这可以通过将查询的 maxResults 属性设置为 1 来完成,这正是 Spring Data 在您使用派生查询方法时会执行的操作 existsBy*。
猜你喜欢
  • 2016-09-11
  • 2018-08-06
  • 1970-01-01
  • 2017-05-09
  • 2018-03-17
  • 1970-01-01
  • 2021-10-13
  • 2021-03-26
  • 2019-04-08
相关资源
最近更新 更多