在Firebird中为Prepared Statement批次一次生成多个ID

时间:2013-02-14 15:39:05

标签: java sql prepared-statement firebird jaybird

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

我将使用INSERT批次进行大量PreparedStatement个操作,我正在寻找一种从Firebird一次获取大量新ID​​的方法。

执行触发器似乎是不可能的,因为我必须在其他表上使用此代码在Java代码中使用INSERT。此外,批量的getGeneratedKeys()似乎尚未在(我的?)Firebird JDBCdriver中实现。

2 个答案:

答案 0 :(得分:4)

我在这里回答内存,但我记得我曾经不得不将Quicken文件中的一堆事务加载到我的Firebird数据库中。我加载了一个包含事务的数组,并将一个名为say iCount的变量设置为该数字。然后我从RDB $ DATABASE做了SELECT GEN_ID(g_TABLE,iCount)。这给了我下一个ID,并根据我要插入的记录数增加了生成器。然后我开始一个事务,逐步遍历数组并一个接一个地插入记录并关闭事务。我很惊讶它的速度有多快。我想,当时,我正在处理大约28,000笔交易,时间就像几秒钟。这样的事可能适合你。

答案 1 :(得分: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。

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

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

披露:我是Jaybird开发者之一