项目中使用了hibernate,有些接口会传递大量id去查询数据,出现了如下错误
java.lang.StackOverflowError: null
at java.lang.Abstract witingBuilder.append(AbstractStringBuilder.java:416) ~[na:1.7.0_17]
at java.lang.StringBuffer.append(StringBuffer.java:237) ~[na:1.7.0_17]
at antlr.BaseAST.toStringList(BaseAST.java:341) ~[antlr-2.7.7.jar:na]
at antlr.BaseAST.toStringList(BaseAST.java:347) ~[antlr-2.7.7.jar:na]
at antlr.BaseAST.toStringList(BaseAST.java:347) ~[antlr-2.7.7.jar:na]
at antlr.BaseAST.toStringList(BaseAST.java:347) ~[antlr-2.7.7.jar:na]
跟踪代码: 发现在debug模式下.
hibernate会去执行HQL的tree的拼接
protected void processQuery(AST select, AST query) throws SemanticException {
if(LOG.isDebugEnabled()) {
LOG.debugf("processQuery() : %s", query.toStringTree());
}
问题就出现在这个query.toStringTree();因为数据比较多. antlr.BaseAST因为递归次数多.出现了StackOverflowError
public String toStringTree() {
String var2 = "";
if(this.getFirstChild() != null) {
var2 = var2 + " (";
}
var2 = var2 + " " + this.toString();
if(this.getFirstChild() != null) {
var2 = var2 + ((BaseAST)this.getFirstChild()).toStringList();
}
if(this.getFirstChild() != null) {
var2 = var2 + " )";
}
return var2;
}
总结起来: 问题就出现在了递归次数太多.