有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java插入失败,然后更新或加载,然后决定是插入还是更新

我有一个java的Web服务,它接收要插入或更新到数据库中的信息列表。我不知道要插入或更新哪一个

哪种方法是获得更好性能结果的最佳方法:

  1. 迭代列表(一个对象列表,上面有表pk),尝试在数据库中插入条目。如果插入失败,请运行更新

  2. 尝试从数据库加载条目。如果检索到的结果更新,则插入条目

  3. 另一种选择?告诉我:)

在第一次调用中,我相信大多数条目都将是新的bd条目,但会有一个饱和点,大多数条目将被更新

我说的是一个DB表,它可以以成熟的形式访问超过1亿个条目

你的方法是什么?表现是我最重要的目标


共 (5) 个答案

  1. # 1 楼答案

    如果性能是你的目标,那么首先从你的词汇表中去掉iterate这个词!学会成套做事

    如果需要更新或插入,请始终先进行更新。否则,您很容易发现自己正在更新意外插入的记录。如果您正在这样做,那么有一个标识符可以帮助您查看记录是否存在。如果标识符存在,则执行更新,否则执行插入

  2. # 2 楼答案

    重要的是要了解插入的数量与您收到的列表更新的数量之间的平衡或比率。IMHO应该实现一个抽象的策略,上面写着“在数据库上持久化这个”。然后制定具体的战略(例如):

    1. 检查主键,如果未找到记录,则插入,否则更新
    2. 执行更新,如果失败,则执行插入
    3. 其他

    然后从配置文件中提取要使用的策略(例如类完全限定名)。这样,您可以轻松地从一种策略切换到另一种策略。如果可行,可能取决于您的领域,您可以根据集合上的输入实体选择最佳策略

  3. # 3 楼答案

    MySQL支持这一点:

    INSERT INTO foo
    SET bar='baz', howmanybars=1
    ON DUPLICATE KEY UPDATE howmanybars=howmanybars+1
    
  4. # 4 楼答案

    方案2不会是最有效的。当您执行实际插入或更新以强制执行主键时,数据库将已经为您执行此检查。通过自己进行此检查,您将产生两倍的表查找开销以及额外的Java代码往返。选择最有可能的情况,并乐观地编码

    展开选项1,可以使用存储过程来处理插入/更新。本例使用PostgreSQL语法,假设插入是正常情况

    CREATE FUNCTION insert_or_update(_id INTEGER, _col1 INTEGER) RETURNS void
    AS $$
        BEGIN
            INSERT INTO
                my_table (id, col1)
            SELECT
                _id, _col1;
        EXCEPTION WHEN unique_violation THEN
            UPDATE
                my_table
            SET
                col1 = _col1
            WHERE
                id = _id;
        END;
    END;
    $$
    LANGUAGE plpgsql;
    

    您还可以将更新设置为正常情况,然后检查受update语句影响的行数,以确定该行是否确实是新的,并且您需要执行插入

    正如其他一些回答中提到的,处理该操作的最有效方法是一批:

    1. 获取传递给web服务的所有行,并将它们大容量插入到临时表中
    2. 从临时表更新主表中的行
    3. 从临时表在主表中插入新行
    4. 处理临时表

    要使用的临时表的类型以及最有效的管理方式将取决于您使用的数据库