【问题标题】:JSR-352 : Stackoverflow error in DB2DataStoreHelper.findMappingClassJSR-352:DB2DataStoreHelper.findMappingClass 中的 Stackoverflow 错误
【发布时间】:2016-08-01 14:16:28
【问题描述】:

原因:java.lang.StackOverflowError 在 java.lang.Integer.valueOf(Integer.java:844) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:430) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 在

........

这个 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445) 一直在发生,直到出现 stackoverflow 错误。当我在 Writers writeItems() 中调用 executeBatch() 时会发生错误,所以我不确定它到底发生在哪里或为什么发生。

这个问题是 3 年前一位面临类似问题的用户提出的。但是没有响应,重新运行也没有帮助。

Infinite loop in DB2 JDBC driver

【问题讨论】:

  • 你能发布一些示例代码吗?
  • 堆栈的底部是什么样的?即使代码进入 findMappingClass() 无限循环的调用集
  • 其余的调用基本上是相同的 com.ibm.websphere.rsadapter.DB2DataStoreHelper.findMappingClass(DB2DataStoreHelper.java:445 一百次,然后 writeItems() line java 126 。这个行号是我在哪里做 Statement.executeBatch()

标签: java websphere-liberty jsr352 java-batch


【解决方案1】:

这看起来像是一个关于如何创建 SQLException 的错误。

在您的场景中 DB2DataStoreHelper.findMappingClass() 发生的事情实际上是这样的:

public Class<?> findMappingClass(SQLException e) {
    // Check if 'e' is in the error map anywhere, 
    // if it is, return the class.

    // otherwise, check the next exception in the chain
    SQLException next = e.getNextException();
    return findMappingClass(next);
}

所以如果你有 2 个或多个 SQLExceptions 会创建一个循环,例如:

SQLException a = new SQLException();
SQLException b = new SQLException();

a.setNextException(b);
b.setNextException(a);

那么你的异常是无效的,因为它创建了一个循环。因此,任何试图处理 SQLException 链的代码都将在您观察到的过程中陷入无限循环。

检查您的应用程序代码以确保在您的任何异常中都没有创建循环。

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多