gpt4 book ai didi

java - Derby - 使用相同的连接创建 PreparedStatement 时,获取 RETURN_GENERATED_KEYS 似乎不是线程安全的

转载 作者:行者123 更新时间:2023-12-02 09:46:02 25 4
gpt4 key购买 nike

我使用 Statement.RETURN_GENERATED_KEYS 一个接一个地运行两个 INSERT sql 调用,每个插入都有自己的唯一 ID 分配给它。

每个调用都是用 connection.prepareStatement 生成的,其中连接可以由不同的线程(连接池或嵌入式数据库 - 无论哪种方式)重新使用。

所以当我这样做时:

result = preparedStatement.getGeneratedKeys();
result.next();
return result.getInt(1);

返回的数字似乎不是线程安全的!! 它通常从第一个经过的线程中获取生成的 ID。

基本上,如果我运行多个线程,则 INSERTS 工作正常,但随后尝试获取自动生成的唯一 ID,它会带回相同的 ID。再次,我怀疑这是因为连接是共享的,我是怎么做的
connection.prepareStatement(sqlString, Statement.RETURN_GENERATED_KEYS);

我看到有许多替代参数,但我不熟悉它们。我怎样才能以某种方式保证每个 PreparedStatement 稍后都会返回它自己唯一的自动生成的 ID?

更新:这似乎只发生在嵌入式 derby 数据库驱动程序中......

最佳答案

为避免这种情况,您必须从以下位置关闭 PreparedStatement:

connection.prepareStatement(sqlString, Statement.RETURN_GENERATED_KEYS);

之前 你创建另一个preparedStatement。看起来嵌入式 Derby 驱动程序中可能假设调用数据库的代码(至少对于 INSERTS)永远不会被线程化。如果您要线程,请执行 不是 使用嵌入式驱动程序。

关于java - Derby - 使用相同的连接创建 PreparedStatement 时,获取 RETURN_GENERATED_KEYS 似乎不是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14907969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com