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 堆空间或-mx512m512mb 等选项来增加堆空间。

通过在网络上设置 VM 参数来搜索增加的堆空间。

这可能会有所帮助

在 Java 中增加堆大小

于 2012-10-11T12:40:09.310 回答