【问题标题】:Derby - Getting RETURN_GENERATED_KEYS doesn't seem to be thread safe when using the same Connection to create the PreparedStatementDerby - 使用相同的 Connection 创建 PreparedStatement 时,获取 RETURN_GENERATED_KEYS 似乎不是线程安全的
【发布时间】:2013-02-01 05:04:10
【问题描述】:

我使用 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 数据库驱动程序中......

【问题讨论】:

    标签: java jdbc derby javadb


    【解决方案1】:

    您可以在三行代码周围使用自己的 Java 同步块,如下所示:

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

    【讨论】:

      【解决方案2】:

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

      connection.prepareStatement(sqlString, Statement.RETURN_GENERATED_KEYS);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 2015-06-01
        相关资源
        最近更新 更多