有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Firebird中为准备好的语句批同时生成多个ID

我正在使用来自PreparedStatementSELECT GEN_ID(TABLE,1) FROM MON$DATABASE来生成一个ID,该ID将在多个表中使用

我将使用PreparedStatement的批处理执行大量的INSERT,并且我正在寻找一种方法,以从Firebird一次获取大量新ID

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


共 (2) 个答案

  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

    正如您所注意到的,jaybird2.2中的批还没有实现getGeneratedKeys()。x、 Jaybird 3.0.0中将提供对该选项的支持,请参见JDBC-452

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

    披露:我是Jaybird开发者之一

  2. # 2 楼答案

    我在这里是凭记忆回答的,但我记得我曾经不得不从Quicken文件将一系列事务加载到我的Firebird数据库中。我加载了一个包含事务的数组,并将一个名为say iCount的变量设置为数字。然后我从RDB$数据库中选择了GEN_ID(g_TABLE,iCount)。这给了我下一个ID,并使生成器增加了我要插入的记录数。然后,我启动了一个事务,遍历数组,一个接一个地插入记录并关闭事务。我很惊讶这一切进展得如此之快。我想,当时我正在处理大约28000笔交易,时间大概只有几秒钟。像这样的东西可能适合你