nik-v
nik-v

Reputation: 753

java out of memory Exception (jdbc)

I am trying to read serialized objects from mysql database in a loop and perform some operations on it in java. I have written the following function for returning me the object from ResultSet the object.

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;
}

When I run this code, it gives me an out of memory exception. I searched around a bit and realized it could be because result set is large and it is kept in memory, so I tried fetching some 50 rows at a time.

But that doesn't seem to help either.

On profiling with visualvm, it reports that all the space is being hogged by byte[] objects. But I am not entirely sure what's going wrong.

Upvotes: 0

Views: 2586

Answers (3)

rustyx
rustyx

Reputation: 85341

By default MySQL JDBC driver fetches the complete ResultSet into memory.

You can change this to a streamed fetch with something like this:

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

The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this any result sets created with the statement will be retrieved row-by-row.

Upvotes: 3

Bhavik Shah
Bhavik Shah

Reputation: 5183

You can increase the heap space by using the option -mx256m for 256mb heap space or -mx512m for 512mb and so on.

Search for increasing heap space by setting VM arguments on net.

this might help

Increase heap size in Java

Upvotes: 0

Aubin
Aubin

Reputation: 14853

Try to add objectIn.close(); before returning, it may help

Upvotes: 0

Related Questions