1

我正在使用SELECT GEN_ID(TABLE,1) FROM MON$DATABASEfrom aPreparedStatement生成将在多个表中使用的 ID。

INSERT我将用s 批次做大量PreparedStatements 并且我正在寻找一种方法来一次从 Firebird 获取大量新 ID。

执行触发器似乎是不可能的,因为我必须INSERT在其他时间使用 Java 代码中的此 ID 在其他表上。此外,getGeneratedKeys()对于批处理似乎还没有在(我的?)Firebird JDBCdriver 中实现。

4

2 回答 2

4

我在这里从记忆中回答,但我记得我曾经不得不将一堆事务从 Quicken 文件加载到我的 Firebird 数据库中。我用事务加载了一个数组,并将一个名为 say iCount 的变量设置为该数字。然后我从 RDB$DATABASE 中执行了 SELECT GEN_ID(g_TABLE, iCount)。这给了我下一个 ID,并将生成器增加了我要插入的记录数。然后我开始一个事务,遍历数组并一个接一个地插入记录并关闭事务。我很惊讶这进展得如此之快。我想,当时我处理了大约 28,000 笔交易,时间大约只有几秒钟。像这样的东西可能对你有用。

于 2013-02-14T16:43:22.587 回答
1

正如 jrodenhi 所说,您可以使用保留一系列值

SELECT GEN_ID(<generator>, <count>) FROM RDB$DATABASE

这将返回一个<count>高于先前生成的键的值,因此您可以使用来自(value - count, value](其中(表示独占、]包含)的所有值。假设生成器当前值为 10,调用GEN_ID(generator, 10)将返回 20,然后您可以使用 11...20 作为 id。

这确实假设您通常使用生成器为您的表生成 id,并且没有使用生成器的任何应用程序构成自己的 id。

正如您所注意到的,getGeneratedKeys()Jaybird 2.2.x 中的批处理尚未实现。Jaybird 3.0.0 将支持此选项,请参阅JDBC-452

除非您还针对其他数据库,否则使用批量更新(在 Jaybird 中)并没有真正的性能优势。Firebird 不支持批量更新,因此 Jaybird 中的内部实现与准备语句并自己重复执行基本相同。这可能会在未来发生变化,因为有计划将其添加到 Firebird 4。

披露:我是 Jaybird 开发人员之一

于 2013-02-15T06:38:29.920 回答