运行以下代码时出现以下错误。我可以知道我的代码有什么问题。提前致谢 。我正在使用hibernate和java
HTTP状态500 - 处理程序处理失败;嵌套异常是java.lang.OutOfMemoryError:超出GC开销限制
@Autowired
SessionFactory sessionFactory;
Session session = null;
Transaction tx = null;
public String getEntityList(String userIds, String callerID) throws Exception {
session = sessionFactory.openSession();
tx = session.beginTransaction();
List<User> userList = session.createCriteria(User.class)
.list();
//Query the database
CallableStatement stmt = null;
String returnVal = "";
ResultSet rs = null;
try {
stmt = ((Connection) session).prepareCall("{?=call WS_Distributionlist(?,?)}");
} catch (SQLException e) {
e.printStackTrace();
}
try {
// left over accounts processing
stmt.executeUpdate();
returnVal += stmt.getString(1) + "|";
System.out.println("RETURN VALUE in tail end :::::: "
+ returnVal);
//returnVal = returnVal.substring(0, returnVal.length() - 1);
System.out.println("Return Value " + returnVal);
session.close();
//return returnVal;
} catch (SQLException e) {
System.out.println("Error while executing the database function ");
} finally {
session.close();
}
tx.commit();
session.close();
return returnVal;
}
答案 0 :(得分:0)
缺少许多有用的细节:
userIds
是函数的输入参数,在哪里使用? userList
,有多少用户,他们在哪里使用?WS_Distributionlist(?,?)
有2个输入参数,您在哪里设置它们?我无法理解以下代码行:
((Connection) session).prepareCall("{?=call WS_Distributionlist(?,?)}");
我已经看到并使用了许多技术来从hibernate会话中获取连接,其中没有一个将会话本身转换为连接,但这或多或少是个人的好奇心。
重点是缺少很多代码,所以我可以推测其中一个调用产生了一个巨大的数据集,或者你正在将一个巨大的参数传递给一个语句。
无论哪种方式,如果你处理HUGE数据集,你应该使用StatelessSession,因为无状态会话几乎没有内存开销(没有缓存)。
如果您从连接构建自己的语句,请使用FORWARD_ONLY_CURSOR。
尝试在返回结果集的语句上设置fetchSize。
考虑使用ScrollableResult或Iterator而不是List作为结果。