JDBC getGeneratedKeys()方法是否始终与插入元素的顺序相同

我executeBatch()与JDBC一起使用以插入多行,并且我想为另一个插入获取插入行的ID,为此我使用以下代码:


insertInternalStatement = dbConncetion.prepareStatement(INSERT_RECORD, generatedColumns);


for (Foo foo: foosHashSet) {


    insertInternalStatement.setInt(1, foo.getMe());

    insertInternalStatement.setInt(1, foo.getMe2());

    // ..

    insertInternalStatement.addBatch();

}

insertInternalStatement.executeBatch();


// now get inserted ids

try (ResultSet generatedKeys = insertInternalStatement.getGeneratedKeys()) {


     Iterator<Foo> fooIterator= foosHashSet.iterator();

     while (generatedKeys.next() && fooIterator.hasNext()) {


         fooIterator.next().setId(generatedKeys.getLong(1));


     }

 }

它工作正常并且返回id,我的问题是:


如果我进行迭代,getGeneratedKeys()并且foosHashSetID将以相同的顺序返回,以便从数据库返回的每个ID都属于对应的Foo实例?


当我使用多线程时,上面的代码同时在多个线程中运行怎么办?


还有其他解决方案吗?我有两个表foo1和foo2,我想先插入foo1记录,然后将其主ID用作foo2外键。


桃花长相依
浏览 239回答 3
3回答

慕田峪7331174

如果getGeneratedKeys未在JDBC规范中定义对批处理执行的支持,则行为将取决于所使用的驱动程序。我希望任何支持生成的用于批处理执行的键的驱动程序都可以返回ID,以便将它们添加到批处理中。但是,您使用的事实Set是有问题的。大多数集合的迭代顺序未定义,并且可能在每次迭代之间发生变化(通常只有在修改后才能更改,但是从理论上讲,您不能假设有关该顺序的任何信息)。您需要使用保证顺序的商品,例如aList或a&nbsp;LinkedHashSet。在这里应用多线程可能不是一个好主意:您一次只能使用一个单线程的JDBC连接。考虑到多线程,要么需要正确锁定,要么需要您分担工作负载,以便可以使用单独的连接。很难说这会提高还是降低性能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java