带有hibernate的java.lang.OutOfMemoryError

时间:2017-04-04 21:39:32

标签: java hibernate

运行以下代码时出现以下错误。我可以知道我的代码有什么问题。提前致谢 。我正在使用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;
}

1 个答案:

答案 0 :(得分:0)

缺少许多有用的细节:

  1. userIds是函数的输入参数,在哪里使用?
  2. userList,有多少用户,他们在哪里使用?
  3. WS_Distributionlist(?,?)有2个输入参数,您在哪里设置它们?
  4. 我无法理解以下代码行: ((Connection) session).prepareCall("{?=call WS_Distributionlist(?,?)}");

    我已经看到并使用了许多技术来从hibernate会话中获取连接,其中没有一个将会话本身转换为连接,但这或多或少是个人的好奇心。

    重点是缺少很多代码,所以我可以推测其中一个调用产生了一个巨大的数据集,或者你正在将一个巨大的参数传递给一个语句。

    无论哪种方式,如果你处理HUGE数据集,你应该使用StatelessSession,因为无状态会话几乎没有内存开销(没有缓存)。

    如果您从连接构建自己的语句,请使用FORWARD_ONLY_CURSOR。

    尝试在返回结果集的语句上设置fetchSize。

    考虑使用ScrollableResult或Iterator而不是List作为结果。