Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不断尝试插入现有键值是否是一种不好的做法_Java_Sql_Oracle_Entity Relationship - Fatal编程技术网

Java 不断尝试插入现有键值是否是一种不好的做法

Java 不断尝试插入现有键值是否是一种不好的做法,java,sql,oracle,entity-relationship,Java,Sql,Oracle,Entity Relationship,我很想从两个层面了解以下细节 持续尝试插入重复数据并允许dbms强制执行实体的约束以拒绝这些插入,这被认为是错误的做法还是最差的性能。或者最好执行某种类型的SELECT COUNT(1)并仅在COUNT不是1时插入 假设从第一项开始,从dbms的角度来看,强制执行实体的约束而不进行多次调用更有效。应用程序代码(Java、.NET等)是否会因为代码不必要地进入异常块而遭受更大的性能影响,即使异常不会被处理 可能重复:如果每次都要进行选择然后插入,则速度会慢得多,因为这需要两次往返。与执行数据库语句

我很想从两个层面了解以下细节

  • 持续尝试插入重复数据并允许dbms强制执行实体的约束以拒绝这些插入,这被认为是错误的做法还是最差的性能。或者最好执行某种类型的SELECT COUNT(1)并仅在COUNT不是1时插入

  • 假设从第一项开始,从dbms的角度来看,强制执行实体的约束而不进行多次调用更有效。应用程序代码(Java、.NET等)是否会因为代码不必要地进入异常块而遭受更大的性能影响,即使异常不会被处理


  • 可能重复:

    如果每次都要进行选择然后插入,则速度会慢得多,因为这需要两次往返。与执行数据库语句所需的时间相比,检查异常的成本不算什么

    有些数据库允许“upsert”语句,允许您在不作为一个调用存在的情况下执行更新和插入


    真的,如果你经常这样做,你需要后退一步,考虑一下整体的算法和架构。为什么您不断尝试插入已经存在的值,并且是否存在可以更改的内容,以使其根本不会发生,而不是在数据库点处理故障。

    如果您必须每次执行选择然后插入,则由于需要两次往返,因此速度会慢得多。与执行数据库语句所需的时间相比,检查异常的成本不算什么

    有些数据库允许“upsert”语句,允许您在不作为一个调用存在的情况下执行更新和插入


    真的,如果你经常这样做,你需要后退一步,考虑一下整体的算法和架构。为什么您要不断尝试插入已经存在的值,并且是否存在可以更改的内容,以使其根本不会发生-而不是在数据库点处理故障。

    就性能而言,最好使用数据库内功能强制执行约束

    当您试图在数据库之外强制执行约束时,您有两个问题。第一个是运行单独的查询、返回结果和执行逻辑(多个数据库操作)的开销。另一方面,使用约束可能做同样的工作,但它在数据库内部完成所有工作,而不需要来回传递东西的额外开销


    第二,当您试图自己强制执行约束时,您引入了竞争条件。这意味着您可以运行
    count()
    ,它返回0。同时,另一个事务插入该值,然后您的插入仍然失败。你真的想避免这样的比赛条件。当然,一个解决方案是将所有逻辑放在一个事务中。这引入了它自己的开销。

    就性能而言,最好使用数据库中的功能来实施约束

    当您试图在数据库之外强制执行约束时,您有两个问题。第一个是运行单独的查询、返回结果和执行逻辑(多个数据库操作)的开销。另一方面,使用约束可能做同样的工作,但它在数据库内部完成所有工作,而不需要来回传递东西的额外开销


    第二,当您试图自己强制执行约束时,您引入了竞争条件。这意味着您可以运行
    count()
    ,它返回0。同时,另一个事务插入该值,然后您的插入仍然失败。你真的想避免这样的比赛条件。当然,一个解决方案是将所有逻辑放在一个事务中。这引入了它自己的开销。

    只是增加了往返时间。一次检查,如果不重复,则另一次插入。 可能是不好。但是如何捕获异常并处理它呢?,
    第一次检查然后插入与捕获异常之间的时间比较
    ,有很大的区别

    编辑:
    第一次检查和插入时可能会出现一个问题,即同步问题。可能是一些线程更新/插入数据之前,你的线程,当你检查,没有重复,结果将是异常结束。所以你必须解决不能离开的问题。

    只是你增加了往返时间。一次检查,如果不重复,则另一次插入。 可能是不好。但是如何捕获异常并处理它呢?,
    第一次检查然后插入与捕获异常之间的时间比较
    ,有很大的区别

    编辑:
    第一次检查和插入时可能会出现一个问题,即同步问题。可能是一些线程更新/插入数据之前,你的线程,当你检查,没有重复,结果将是异常结束。因此,您必须解决无法离开的问题。

    就我个人而言,我可能会编写一个游标来检查记录是否存在。对我来说,这是一种比依赖异常来控制程序流更干净的方法。是的,有一个性能的影响,但它可能是边缘。干净、可读的代码将优先考虑我。

    就我个人而言,我可能会编写一个游标来检查记录是否存在。对我来说,这是一种比依赖异常来控制程序流更干净的方法。是的,有一个性能的影响,但它可能是边缘。干净易读的代码对我来说是最重要的。

    这里有一些关于为什么我们会不断尝试插入相同值的更多细节。我们有一个复杂的生产环境,它具有固定的事务日志结构(web服务请求)。从…起