【问题标题】:How do you catch a MySQLIntegrityConstraintViolationException correctly?如何正确捕获 MySQLIntegrityConstraintViolationException?
【发布时间】:2011-02-21 11:34:52
【问题描述】:

我正在开发一个 Web 应用程序,并且在我提交用户独有的表单时,一个

 MySQLIntegrityConstraintViolationException Duplicate entry -'username'
对于键 'PRIMARY'

我很清楚为什么会出现这种情况,因为我试图使用相同的主键将重复的条目输入到数据库中。我将不胜感激,因为这可能是多余的。

我真正要问的是我应该如何处理这个问题。我试图抓住这个例外,但显然我缺乏经验已经赶上了我。

感谢您的帮助。

有没有更好的方法来检查数据库中的重复条目?

例如,我是否应该在检查重复成员时执行我的操作,只检查数据库中匹配的用户名和密码?

谢谢

【问题讨论】:

    标签: java mysql exception-handling


    【解决方案1】:

    一般来说,如果可以避免抛出异常,因为它们是控制程序工作流程的繁重机制。您应该只使用它们来跟踪错误和不规则的活动/情况。这意味着如果你捕获了一个异常,你唯一能做的就是记录更多,将异常包装在另一个异常中并最终触发一些回退程序逻辑。

    不要期望捕获异常而只检查正确的用户名。如果你正在开发某种注册表单,我想你会经常做这个检查......对于普通用户来说有一些流行的词,如果你在异常情况下实现它,你会经常发现它......

    不幸的是,如果您的数据库非常大,主键是许多复杂的对象,那么您将无法在内存中保留一些元素来执行此重复条目检查。

    【讨论】:

      【解决方案2】:

      是的,尤其是在这种情况下,最好在尝试插入用户之前检查是否存在具有相同用户名的其他用户

      【讨论】:

      • 假设内存中没有所有的用户名,在尝试插入记录之前检查 id 是否存在更好?您将为每次插入而不是偶尔的异常进行数据库查找。
      • 您通常在该字段上有一个索引,因此查找速度非常快。
      • 但它仍然需要在网络上往返。这比异常慢了几个数量级。
      • 如果您测量到这是一个严重的问题(例如 10 毫秒与 500 毫秒),那么当然要捕获异常。如果请求的绝对值和这段代码的使用频率并不意味着这是一个问题,那么任何一个都可以
      【解决方案3】:

      我也遇到了同样的问题,尝试使用 catch (MySQLIntegrityConstraintViolationException sql) 处理异常。 但是不要忘记,MySQLIntegrityConstraintViolationException 有两种类型,一种用于 JDBC,一种用于 JDBC4。 所以我建议在两个单独的 try catch 循环中同时捕获两者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        相关资源
        最近更新 更多