【问题标题】:Best practice to check duplicate value in database using java使用java检查数据库中重复值的最佳实践
【发布时间】:2013-04-24 05:30:33
【问题描述】:

我使用 @Column(unique=true) 为用户名设置唯一约束 在将数据插入数据库之前检查重复值的最佳做法是什么?

  1. 通过捕获在您尝试插入具有相同用户名的数据时程序抛出的异常。
  2. 在尝试插入之前检查数据库是否提供的用户名已经存在。

【问题讨论】:

  • 这种情况会经常发生吗?或者只是非常罕见(即使只是在出现错误的情况下)?
  • @ling.s 如果多个客户端尝试插入可能会失败
  • @ling.s:但是,考虑到并发数据库更新,第二个选项可能不会 100% 安全。
  • @MarounMaroun 我认为在这种情况下捕获唯一索引违规异常是合理的。无论如何你都需要抓住它,因为方法 2 不是原子的,因此从多个客户端完成时不安全。

标签: java database unique


【解决方案1】:

我认为解决方案 1(try-catch)很好。对于解决方案 2,如果您的数据库中有并发,您仍然需要进行异常处理。

【讨论】:

  • +1。这个论点很有道理。对服务器进行额外检查不会给您带来太多好处,因为无论如何您都需要异常处理(在 Java 中可能很混乱,但使用 JPA 可能更容易)。但也许对 Web 客户端 (Ajax) 进行额外检查可以改善用户体验。
【解决方案2】:

这取决于您的设计。如果有问题的检查在性能上不重要或成本不高,那并不重要。与有时需要在我们知道可以完成操作之前完成的大量检查(取决于手头的问题)相比(通常无论如何都需要错误处理),从 DB 抽象层抛出的异常可以减少代码中的噪音.

还有另一个方面:独一无二真的是你想要的吗(继续阅读)? 如果您使用的是 MS SQL 服务器,它不支持 ANSI-nulls,即定义为唯一的列可能只包含一个空值。我怀疑用户名永远不会为空,但在其他一些唯一列上可能不是这种情况 - 在 MS SQL Server 上时,您需要应用唯一过滤索引(或此类)或事先在应用程序中进行检查。

我投票赞成抛出异常 + @eis 的建议:检查 UI 中的用户名可用性。

【讨论】:

【解决方案3】:

当在 UI 中输入此类用户名数据时,立即检查用户名的重复项,假设此类 UI 存在。以 javascript/XHR 为例。

并在提交后重新检查,因为可以跳过 javascript 验证并且情况可能已经改变。

如果在这一切之后仍然存在重复的用户名(由于检查失败或有人同时插入它),这对我来说听起来像是一个例外情况,所以抓住一个例外。

所以简而言之,两个选项,第二个检查两次。

【讨论】:

  • 这并没有消除在后端检查用户名的需要。
  • 如果您需要有代码来处理异常,并且您有 XHR 客户端检查,那么第二次服务器端验证有什么意义?
  • @Thilo 区分这些情况。如果即使预先检查也有异常,这是一个例外情况,因为在完全相同的时间输入重复的用户名可能表明有人试图弄乱您的系统。这是您想要了解的事情。在这种情况下,它应该单独记录。但是,关闭 javascript 的人并不是例外情况,也不应该导致异常。
  • 如果您已经有代码可以很好地处理异常,为什么不呢?
  • 另外,无论如何,您都必须编写用于捕获数据库异常的逻辑。您希望该代码存在,但您不想在正常使用流程中输入该代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多