有 Java 编程相关的问题?

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

java ArrayIndexOutOfBoundsException在使用自动生成键和Oracle时

我在以下情况下使用ojdbc6-11.1.0.7.0:

ps = connection.prepareStatement("Insert into A (b, C) values (?, ?)", Statement.RETURN_GENERATED_KEYS);

我明白了

java.lang.ArrayIndexOutOfBoundsException: 3
    at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)
    at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623)
    at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1212)
    at oracle.jdbc.driver.T4CPreparedStatement.<init>(T4CPreparedStatement.java:28)
    at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3140)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3042)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5890)

我刚刚读到关于这个bug here,但解决方案并没有帮助,因为我使用了语句。返回生成的密钥功能

还有其他解决办法吗


共 (2) 个答案

  1. # 1 楼答案

    请使用oracle的ojdbc6.jar(而不是ojdbc6_g.jar)。它将解决这个问题

  2. # 2 楼答案

    好的,现在我们做一个变通方案:

    • 不带语句插入。返回生成的密钥
    • 因为我们使用序列生成ID,所以添加了额外的查询:

      select seq.currval from dual
      

    这很好,但是我们没有很多用户,而且这个解决方案不能防止多线程问题(我们可能会得到错误的Id)