为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

桃花长相依 2021-04-05 14:18:41
我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 idstry (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外键。
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

如果getGeneratedKeys未在JDBC规范中定义对批处理执行的支持,则行为将取决于所使用的驱动程序。我希望任何支持生成的用于批处理执行的键的驱动程序都可以返回ID,以便将它们添加到批处理中。

但是,您使用的事实Set是有问题的。大多数集合的迭代顺序未定义,并且可能在每次迭代之间发生变化(通常只有在修改后才能更改,但是从理论上讲,您不能假设有关该顺序的任何信息)。您需要使用保证顺序的商品,例如aList或a LinkedHashSet

在这里应用多线程可能不是一个好主意:您一次只能使用一个单线程的JDBC连接。考虑到多线程,要么需要正确锁定,要么需要您分担工作负载,以便可以使用单独的连接。很难说这会提高还是降低性能。


查看完整回答
反对 回复 2021-04-18
  • 3 回答
  • 0 关注
  • 238 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信