java在Firebird中为准备好的语句批同时生成多个ID
我正在使用来自PreparedStatement
的SELECT GEN_ID(TABLE,1) FROM MON$DATABASE
来生成一个ID,该ID将在多个表中使用
我将使用PreparedStatement
的批处理执行大量的INSERT
,并且我正在寻找一种方法,以从Firebird一次获取大量新ID
执行触发器似乎是不可能的,因为我必须在Java代码中使用此ID在另一时间对其他表执行INSERT
。另外,批处理的getGeneratedKeys()
似乎还没有在(my?)中实现Firebird JDBC驱动程序
# 1 楼答案
正如jrodenhi所说,您可以使用
这将返回比先前生成的键高出
<count>
的值,因此您可以使用(value - count, value]
中的所有值(其中(
表示独占,]
包含)。假设生成器当前的值为10,调用GEN_ID(generator, 10)
将返回20,然后可以使用11。。。身份证20张这确实假设您通常使用生成器为表生成ID,并且没有应用程序在不使用生成器的情况下生成自己的ID
正如您所注意到的,jaybird2.2中的批还没有实现
getGeneratedKeys()
。x、 Jaybird 3.0.0中将提供对该选项的支持,请参见JDBC-452除非您也针对其他数据库,否则使用批处理更新(在Jaybird中)并没有真正的性能优势。Firebird不支持更新批处理,因此Jaybird中的内部实现与准备语句并自己重复执行语句基本相同。这可能会在未来发生变化,因为有计划将其添加到Firebird 4中
披露:我是Jaybird开发者之一
# 2 楼答案
我在这里是凭记忆回答的,但我记得我曾经不得不从Quicken文件将一系列事务加载到我的Firebird数据库中。我加载了一个包含事务的数组,并将一个名为say iCount的变量设置为数字。然后我从RDB$数据库中选择了GEN_ID(g_TABLE,iCount)。这给了我下一个ID,并使生成器增加了我要插入的记录数。然后,我启动了一个事务,遍历数组,一个接一个地插入记录并关闭事务。我很惊讶这一切进展得如此之快。我想,当时我正在处理大约28000笔交易,时间大概只有几秒钟。像这样的东西可能适合你