hibernate條件語句中使用IN報錯導致堆棧溢出

由於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時,會導致堆棧溢出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章