Java Derby:同一事件的第二个触发器导致ArrayIndexOutOfBoundsException

Java Derby:同一事件的第二个触发器导致ArrayIndexOutOfBoundsException,java,derby,triggers,Java,Derby,Triggers,为了进行测试,我试图在Derby数据库中模拟Oracle模式。 对于同一个表,模式还应该包括2个触发器 我对它们的定义如下: create trigger myTrigger after update on myTable referencing old as oldRow new as newRow for each row MODE DB2SQL delete from otherTable where otherTable.id=newRow.id

为了进行测试,我试图在Derby数据库中模拟Oracle模式。 对于同一个表,模式还应该包括2个触发器

我对它们的定义如下:

create trigger myTrigger
    after update on myTable
    referencing old as oldRow new as newRow
    for each row MODE DB2SQL
        delete from otherTable where otherTable.id=newRow.id and newRow.usable is not null and newRow.usable='1' and oldRow.usable='0';

create trigger myTrigger2
    after update on myTable
    referencing old as oldRow new as newRow
    for each row MODE DB2SQL
        update myTable set counter=0 where myTable.id=newRow.id and newRow.usable is not null and newRow.usable='1' and oldRow.usable='0';
当我只定义其中一个时,它工作正常,但一旦我同时定义了这两个,就会出现以下错误:

[...]
Caused by: java.sql.SQLException: Java exception: '-1: java.lang.ArrayIndexOutOfBoundsException'.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
    at de.bmw.database.DerbySqlConnector.sql(DerbySqlConnector.java:287)
    ... 27 more
Caused by: java.sql.SQLException: Java exception: '-1: java.lang.ArrayIndexOutOfBoundsException'.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
    ... 38 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:400)
    at java.util.ArrayList.remove(ArrayList.java:477)
    at org.apache.derby.iapi.services.context.ContextManager.popContext(Unknown Source)
    at org.apache.derby.iapi.services.context.ContextImpl.popMe(Unknown Source)
    at org.apache.derby.impl.store.access.RAMTransaction.destroy(Unknown Source)
    at org.apache.derby.iapi.sql.dictionary.SPSDescriptor.getPreparedStatement(Unknown Source)
    at org.apache.derby.iapi.sql.dictionary.SPSDescriptor.getPreparedStatement(Unknown Source)
    at org.apache.derby.impl.sql.execute.GenericTriggerExecutor.executeSPS(Unknown Source)
    at org.apache.derby.impl.sql.execute.RowTriggerExecutor.fireTrigger(Unknown Source)
    at org.apache.derby.impl.sql.execute.TriggerEventActivator.notifyEvent(Unknown Source)
    at org.apache.derby.impl.sql.execute.UpdateResultSet.fireAfterTriggers(Unknown Source)
    at org.apache.derby.impl.sql.execute.UpdateResultSet.open(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
    ... 31 more

有人知道触发器定义有什么问题吗?

触发器问题通常很难重现。你能在一个独立的简单例子中很容易地重现这个吗?如果可以,我鼓励您联系Apache上的derby开发人员邮件列表,并将其报告给开发人员,因为这在我看来肯定是一个derby bug。我找到时间创建一个独立的示例,触发器在这个简单的设置中正常工作。问题似乎与剩余的架构设置有关。一旦我发现了邪恶的源头,我会立即更新这个帖子。为了跟进这个问题:我隔离了这个问题,并发现它实际上是独立工作的。但如果应用我们的整个模式,就会导致上述错误。不幸的是,我没有找到时间来进一步分析这个问题,因为我们决定尽快切换到h2。