java递归查询-——java.lang.StackOverflowError,求解!

qq744056399 2016-12-28 08:57:51
在网上看了这个异常的发生原因,一种是递归程序陷入死循环,内存耗尽;一种是JVM内存过小,递归过度消耗内存。
检查Eclipse的eclipse.ini的配置文件,“Xms256m-Xmx1024m”,内存也不小。
下面我把java代码贴出来,希望大家能帮我分析下原因,万分感谢。

package com.MSG2.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class QueryMessageServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
private static final long serialVersionUID = 6370397999953861485L;
private List<Map<String,Object>> query(String serial,Connection conn) throws SQLException {
if(conn != null){
conn.close();
}
String URL = "jdbc:mysql://localhost:3306/test3?useUnicode=true&characterEncoding=utf-8";
String USER = "root";
String PWD = "123456";
conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL, USER, PWD);
String sql1 = "SELECT Message,number,messa,user,Raply FROM reply WHERE Message=?";
PreparedStatement pst = conn.prepareStatement(sql1);
pst.setString(1, serial);
ResultSet rs = pst.executeQuery();
if (rs != null){
List<Map<String,Object>> list1 = new ArrayList<Map<String,Object>>();
while (rs.next()) {
Map<String, Object> map1 = new HashMap<String,Object>();
String Message = rs.getString("Message");
map1.put("Message",Message);
map1.put("number",rs.getString("number"));
map1.put("messa",rs.getString("messa"));
map1.put("user",rs.getString("user"));
map1.put("Raply",rs.getString("Raply"));
List<Map<String,Object>> l = query(Message, conn);
map1.put("replys", l);
list1.add(map1);
}
return list1;
}
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
}
}
return null;
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String URL = "jdbc:mysql://localhost:3306/test3?useUnicode=true&characterEncoding=utf-8";
String USER = "root";
String PWD = "123456";
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL, USER, PWD);
String sql = "SELECT serial,username,content FROM message";
PreparedStatement pre = conn.prepareStatement(sql);
ResultSet re = pre.executeQuery();
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
if (re != null) {
while (re.next()) {
Map<String, Object> map = new HashMap<String, Object>();
int serial1 = re.getInt("serial");
String serial = "" + serial1;
map.put("serial", serial);
map.put("username", re.getString("username"));
map.put("content", re.getString("content"));
List<Map<String,Object>> l = query(serial, conn);
map.put("replys", l);
list.add(map);
}
} else {
System.out.println("还未留言");
}
HttpSession session = req.getSession();
session.setAttribute("list",list);
resp.sendRedirect(req.getContextPath() + "/list.jsp");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
}
}

}

}

...全文
198 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
浮云若水 2016-12-29
  • 打赏
  • 举报
回复
异常信息呢?你的内存损耗是在 List<Map<String,Object>> l = query(Message, conn); List<Map<String,Object>> l = query(serial, conn); 这两行代码 每一条记录你都要去数据库再找一遍 多麻烦 hibernate提供list映射的
qq744056399 2016-12-29
  • 打赏
  • 举报
回复
谢谢大神哈!不过我还没学映射呢! 问题我已经找到了 是因为Message的值与serial相等了所有才会报错。 不过大神你可以给我说说怎么用映射吗?

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧