尝试使用生成的 id 批量插入表时出现“autoKeyInfo 未初始化”

问题描述 投票:0回答:2

当我尝试将 Oracle JDBC 驱动程序从

ojdbc8 19.6.0.0
升级到
ojdbc11 21.6.0.0.1
时,在尝试使用数据库中生成的 id 进行批量插入时,我开始收到以下异常:

java.lang.AssertionError: autoKeyInfo is not initialized

我为此创建了一个重现器。

如何解决这个问题?

oracle jdbc
2个回答
1
投票

复制器不只是进行批量更新,它使用 Keyholder 并尝试返回数据库生成的 ID。问题不在于值的生成,问题在于尝试返回它们。

https://docs.oracle.com/en/database/oracle/oracle-database/21/jjdbc/Oracle-extensions.html#GUID-9EC82134-1206-4325-A17B-9FA7610F0169说“DML返回不能是结合批量更新”。 “DML 返回”是指驱动程序使用“返回”子句来返回输出参数的值。看起来像是新驱动程序版本中的有意识的回归。 Spring 使用 Keyholder 来处理参数。

当使用标识列或触发器或在 SQL 语句中使用 .nextval 在数据库中创建键并且不尝试返回生成的值时,批量插入应该可以工作。


1
投票

这似乎是 Oracle JDBC 驱动程序更高版本中的一个错误。 他们在问题跟踪器中找到了调查结果,但我没有任何可链接的内容,因为它不是公开的。

建议的解决方法是使用 LTS 驱动程序版本,即

ojdbc 19.15.0.0.1

版本

23.3.0.23.09
又可以正常工作了。

已测试版本

不工作

  • 21.9.0.0
  • 21.6.0.0.1

工作

  • 19.15.0.0.1
  • 19.18.0.0
© www.soinside.com 2019 - 2024. All rights reserved.