gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:18:14 25 4
gpt4 key购买 nike

我将 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,我的问题是:

  1. 如果我遍历 getGeneratedKeys()foosHashSet id 是否会以相同的顺序返回,以便从数据库返回的每个 id 都属于相应的 Foo 实例?

  2. 当我使用多线程和以上代码同时在多个线程中运行时怎么办?

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

最佳答案

鉴于 JDBC 规范中未定义对批处理执行的 getGeneratedKeys 的支持,行为将取决于所使用的驱动程序。我希望任何支持为批量执行生成 key 的驱动程序都按添加到批处理中的顺序返回 ID。

但是,您使用 Set 的事实是有问题的。大多数集合的迭代顺序未定义,并且可以在迭代之间更改(通常仅在修改后,但理论上您不能对顺序进行任何假设)。您需要使用具有保证顺序的东西,例如 List 或者 LinkedHashSet

在这里应用多线程可能不是一个好主意:您应该一次只使用来自单线程的 JDBC 连接。考虑多线程要么需要正确的锁定,要么要求您拆分工作负载以便它可以使用单独的连接。这是否会改善或恶化性能很难说。

关于java - JDBC getGeneratedKeys() 方法是否始终与插入元素的顺序相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com