java插入失败,然后更新或加载,然后决定是插入还是更新
我有一个java的Web服务,它接收要插入或更新到数据库中的信息列表。我不知道要插入或更新哪一个
哪种方法是获得更好性能结果的最佳方法:
迭代列表(一个对象列表,上面有表pk),尝试在数据库中插入条目。如果插入失败,请运行更新
尝试从数据库加载条目。如果检索到的结果更新,则插入条目
另一种选择?告诉我:)
在第一次调用中,我相信大多数条目都将是新的bd条目,但会有一个饱和点,大多数条目将被更新
我说的是一个DB表,它可以以成熟的形式访问超过1亿个条目
你的方法是什么?表现是我最重要的目标
# 1 楼答案
如果性能是你的目标,那么首先从你的词汇表中去掉iterate这个词!学会成套做事
如果需要更新或插入,请始终先进行更新。否则,您很容易发现自己正在更新意外插入的记录。如果您正在这样做,那么有一个标识符可以帮助您查看记录是否存在。如果标识符存在,则执行更新,否则执行插入
# 2 楼答案
重要的是要了解插入的数量与您收到的列表更新的数量之间的平衡或比率。IMHO应该实现一个抽象的策略,上面写着“在数据库上持久化这个”。然后制定具体的战略(例如):
然后从配置文件中提取要使用的策略(例如类完全限定名)。这样,您可以轻松地从一种策略切换到另一种策略。如果可行,可能取决于您的领域,您可以根据集合上的输入实体选择最佳策略
# 3 楼答案
MySQL支持这一点:
# 4 楼答案
方案2不会是最有效的。当您执行实际插入或更新以强制执行主键时,数据库将已经为您执行此检查。通过自己进行此检查,您将产生两倍的表查找开销以及额外的Java代码往返。选择最有可能的情况,并乐观地编码
展开选项1,可以使用存储过程来处理插入/更新。本例使用PostgreSQL语法,假设插入是正常情况
您还可以将更新设置为正常情况,然后检查受update语句影响的行数,以确定该行是否确实是新的,并且您需要执行插入
正如其他一些回答中提到的,处理该操作的最有效方法是一批:
要使用的临时表的类型以及最有效的管理方式将取决于您使用的数据库
# 5 楼答案
如果您的数据库支持合并,我会认为这是最有效的(并将所有数据视为单个数据集)
见:
http://www.oracle.com/technology/products/oracle9i/daily/Aug24.html
https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=194