由於hibernate不支持子查詢,在hibernate的WHERE條件語句中使用IN查詢時,如果超過1000條數據,並不是MySQL的限制,會報如下錯誤:
15:08:40.134 logback [http-nio-8096-exec-3] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause
java.lang.StackOverflowError: null
at antlr.BaseAST.toString(BaseAST.java:333)
at antlr.BaseAST.toStringList(BaseAST.java:341)
at antlr.BaseAST.toStringList(BaseAST.java:347)
at antlr.BaseAST.toStringList(BaseAST.java:347)
at antlr.BaseAST.toStringList(BaseAST.java:347)
解決辦法:控制IN內數據小於1000條,或分成多個IN,用OR連接,或者將IN中的數據放到一個字符串中,mysql可以解析處理。
有文章說hibernate已經解決了這個問題,待驗證。
後來也遇到過同樣的報錯,當時覺得是由於日誌打印級別爲debug級別,導出輸出日誌信息過多,佔用內存過大,導致堆棧溢出。其實這兩者有着必然的聯繫,當時沒有深入跟蹤代碼,導致忽略了報錯真正的原因。
跟蹤代碼,打印堆棧信息就會一目瞭然了
綜上,其實是在日誌級別設置debug時,會導致堆棧溢出。