我需要根据记录是否已存在来插入或更新记录。
我正在使用JdbcBatchItemWriter来写入记录。 但是如果带有主键的记录已经存在,我应该更新它......
所以一个解决方案是:
制作两个单独的列表,一个用于插入,一个用于更新(注意:我每次都必须检查我的处理器是否记录已经存在,从而将记录添加到其中一个列表中),并且在我的编写器中有两个不同的 JdbcBatchItemWriter 实例,例如:
JdbcBatchItemWriter<insertList> insertWriter;
JdbcBatchItemWriter<updateList> updateWriter;
有没有其他方法可以根据批量更新时已经存在的记录在编写器中的查询之间切换......即只有一个
JdbcBatchItemWriter<mylist> allWriter...and
allWriter.write(mylistallitems);
我正在考虑使用合并查询...但是有什么性能问题吗?
拥有两个不同的列表可能是更好的选择,因为如果将来有不同的持久性机制,则无需重新设计应用。您可能希望使用单个查询来从数据库获取所有现有主键,将其存储为集合持有者,并在处理器中引用它。
在SO上对"Oracle Merge Performance"进行简短搜索会发现由于不同因素而导致的多个性能问题实例,并且可能比精心设计的插入/更新SQL慢。
此外,如果您再次收到完整的数据(用于更新),您可能需要考虑截断插入方法 [通过添加侦听器在插入之前删除]