0

mysql データベースからシリアル化されたオブジェクトをループで読み取り、Java でいくつかの操作を実行しようとしています。ResultSet オブジェクトからオブジェクトを返すために、次の関数を作成しました。

public static MyObj deSerializeCacheTagInfo(ResultSet res
    ) throws SQLException, IOException, ClassNotFoundException 
{
    byte[] buf = res.getBytes(3);
    ObjectInputStream objectIn = null;
    if (buf != null)
        objectIn = new ObjectInputStream(new ByteArrayInputStream(buf));
    MyObj info = (MyObj)objectIn.readObject();
    return info;
}

このコードを実行すると、メモリ不足の例外が発生します。少し調べてみたところ、結果セットが大きく、メモリに保持されていることが原因である可能性があることに気付いたので、一度に約50行をフェッチしてみました。

しかし、それも役に立たないようです。

visualvm でプロファイリングすると、すべてのスペースが によって占有されていることが報告されbyte[] objectsます。しかし、何が問題なのか完全にはわかりません。

4

3 に答える 3

3

デフォルトでは、MySQL JDBC ドライバーは完全な ResultSetをメモリーにフェッチします。

次のような方法で、これをストリーミング フェッチに変更できます。

Statement st = connIn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
st.setFetchSize(Integer.MIN_VALUE);

転送専用、読み取り専用の結果セットとフェッチ サイズ Integer.MIN_VALUE の組み合わせは、結果セットを行ごとにストリーミングするためのドライバーへのシグナルとして機能します。この後、ステートメントで作成された結果セットは行ごとに取得されます。

于 2013-04-12T21:38:06.650 に答える
0

objectIn.close();戻る前に追加してみてください。役立つ場合があります

于 2012-10-08T22:28:24.230 に答える
0

-mx256m256mb ヒープ スペースまたは512mb などのオプションを使用して、ヒープ スペースを増やすことができます-mx512m

net で VM 引数を設定して、ヒープ スペースの増加を検索します。

これは役立つかもしれません

Java でヒープ サイズを増やす

于 2012-10-11T12:40:09.310 に答える