2017-04-04 10 views
0

以下のコードを実行すると、以下のエラーが発生します。私のコードで何が間違っているのか分かりますか?前もって感謝します 。私は休止状態とjavaを使用していますjava.lang.OutOfMemoryError with Hibernate

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

コードが組み込まれていれば、コードを読むのは簡単です – prasanth

+0

あなたのアプリケーションにどれくらいのメモリを与えましたか?あなたのストアドプロシージャ 'WS_Distributionlist'は何をしますか?クエリからいくつの行が必要ですか? – prasanth

答えて

0

を超えた便利な詳細の多くが欠落している:

  1. userIdsは、それが使用されている関数の入力パラメータのですか?
  2. userList、そこには何人のユーザーがいて、どこに使用されていますか?
  3. WS_Distributionlist(?,?)には2つの入力パラメータがあります。どこに設定しますか?

私は次のコード行を理解することはできません。 ((Connection) session).prepareCall("{?=call WS_Distributionlist(?,?)}");

私が見てHibernateセッションのうち、接続を取得するために多くの技術を使用しましたが、どれものところ接続にセッション自体を鋳造し、これは多かれ少なかれ個人的な好奇心です。

欠けているコードがたくさんあるので、私はちょうどこの呼び出しの1つが巨大なデータセットを生成すると推測したり、大きなパラメータを文に渡していると推測できます。

いずれにしても、HUGEデータセットを扱う場合は、ステートレスセッションのメモリオーバーヘッドがほとんどゼロ(キャッシングなし)であるため、おそらくStatelessSessionを使用してください。

接続から独自のステートメントを作成する場合は、FORWARD_ONLY_CURSORを使用します。

結果セットを返すステートメントにfetchSizeを設定してみてください。

リストの代わりにScrollableResultまたはIteratorを使用することを検討してください。

関連する問題