原因: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年前一位面临类似问题的用户提出的。但没有回应,重新运行也无济于事。
DB2 JDBC驱动程序中的无限循环
这看起来像是创建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);
}
因此,如果您有两个或多个创建循环的SQLException,例如:
SQLException a = new SQLException();
SQLException b = new SQLException();
a.setNextException(b);
b.setNextException(a);
那么您的异常是无效的,因为它会创建一个循环。因此,正如您所观察到的,任何试图处理SQLException链的代码都将运行到一个无限循环中。
检查您的应用程序代码,以确保在任何异常中都没有创建周期。