当前位置: 首页 > 知识库问答 >
问题:

JDBC模板:如何正确处理不存在的插入[重复]

袁炳
2023-03-14

我有一个主键列为email的表用户。我有一段代码,其中存储了只调用userDao的用户。商店(用户) 由于约束存在,我可以捕获异常并在UI上显示错误。这种方法效果很好。另一种解决方案是首先检查用户是否存在,然后将其存储在数据库中。这将导致两个连续的查询-选择,然后插入。因此,基本上,如果用户存在,我会显示错误。我在这里看到的问题是,如果两个拥有相同电子邮件的用户试图同时注册并提供相同的电子邮件。这可能发生在两个线程都检查用户是否存在并且不返回任何内容时。然后第一个线程保存用户,第二个线程抛出异常。第三种方法是使用合并查询(我使用hsqldb)。基本上,在一个查询中,我只在用户不存在时插入用户。然后我可以看到查询的结果。如果没有行发生更改,则表示用户存在,我可以显示错误。这两种方法都不会破坏我的数据的一致性。但我正在寻找处理此类问题的最佳实践。


共有2个答案

子车安和
2023-03-14

这种情况发生的可能性很小,你真的不必考虑。尤其是如果您在某人使用系统之前使用电子邮件验证。如果您仍然担心,您可以通过对呼叫使用同步操作来检查电子邮件的存在,从而将机会降至最低。如果您有一个群集环境,并且代码运行在2个或更多个负载均衡服务器上,则无法正常工作。

东郭远航
2023-03-14

你的第一直觉是正确的。要防止重复,请在该列上定义一个唯一的约束。然后捕获因违反该约束而导致的任何异常。

SQL缺少原子插入(如果不存在)命令。您将看到使用嵌套SELECT语句的代码,但此类代码不是原子代码,因此您仍然需要捕获唯一约束冲突。

这个问题基本上是重复的。搜索StackOverflow获取更多讨论和示例。

顺便说一下,我建议不要使用电子邮件地址作为主键。如果用户想更改其帐户上的电子邮件地址,您必须使用该值作为外键更新所有相关记录。我建议几乎总是使用代理密钥而不是自然密钥。

 类似资料:
  • 问题内容: 我需要将几亿条记录插入mysql db。我要一次插入一百万个。请在下面查看我的代码。它似乎很慢。有什么方法可以优化它吗? 问题答案: 我在mysql中遇到类似的性能问题,并通过在连接URL中设置useServerPrepStmts和rewriteBatchedStatements属性来解决。

  • 请注意 这个重试功能在Spring Batch 2.2.0里面退出,现在它是Spring Retry的一部分. 为了让这个进程更稳定,更小的失败性。有时它帮助自动重试一个失败的操作以防止它可能在后续的尝试成功。本质上,这种处理会导致误差。例如,远程调用网络服务或RMI服务失败是由于在短暂的数据更新后,网络故障或冻结异常aDeadLockLoserException.例如重试这种自动化操作,Spri

  • 我正在创建一个用于处理用户输入的类。这样,在其他项目中,我可以从类中调用方法,而不必担心在每个新项目中创建扫描程序。 类中将有一个单独的方法来处理不同的变量类型(float、int、String等)。我从浮动类型开始: 这个方法工作得很好,只是它必须在else部分返回一个float。在本例中,它是一个零,因此当输入到计算器(例如)时,零会导致任何输出等于零。 有没有返回空浮点值的方法来克服这个问题

  • 我正在创建一个android应用程序,它需要一个到服务器的永久TCP连接。 我创建了一个服务,用于建立连接并侦听Inputstream上的传入字节(该服务在后台运行)。 前4个传入字节表示完整消息的消息长度。 在将完整的消息从Inputstream读入单独的缓冲区后,我想在分析消息的单独线程中调用另一个服务/异步任务。(服务应继续侦听更多传入消息)。 Android/Java中是否有一个现有的Me

  • Thymeleaf非常强调“自然模板”,这意味着所有模板都已经是有效的XHTML文件。我一直认为这是向前迈出的一大步,我可以在我的模板中生成片段,例如在我编写的JSP中 我的“布局”-标记文件包含所有标题标记(标题、样式表链接等),菜单和justs在右点插入标题文本和正文。在设计html框架时,我不需要知道任何关于样式表菜单之类的东西。 这与Thymeleaf的想法相反,它鼓励我创建完整的html

  • 问题内容: Java的I / O类,,,和他们的不同子类中都有一个可抛出的方法。 对于处理此类异常的正确方法是否存在共识? 我经常看到建议,只是默默地忽略它们,但这是错误的,至少在打开用于写的资源的情况下,关闭文件时出现问题可能意味着无法写入/发送未刷新的数据。 另一方面,在阅读资源时,我还不清楚为什么会抛出异常以及如何处理。 那么有什么标准建议吗? 问题答案: 记录下来。 您实际上不能 做任何事