db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From frederic barachant <ms.barach...@free.fr>
Subject out of memory when writing blobs
Date Tue, 13 Mar 2007 17:12:52 GMT
Hello.
For two days i am fighting a problem when using JPA (toplink) with derby 
to persist data of my program.
One object i persist saves a byte[] into a blob. I looked for oome 
reports and checked for bug 1693, which was corrected for 10.2.2.
I modified its test class in order to check for what should JPA be doing 
and found that in order to be able to save some 8MB arrays, i need to 
set java heap to 128MB. Also, if i try to persist objects with multiple 
4-6MB arrays, i get oome with 64MB after only a handful of persisted 
objects.
Is that intended?
Of course, sending data to the database using a stream works, but as far 
as i could gather, sending the array through a stream during persistence 
is not possible.
I am using derby 10.2.2, java 1.6.0_01ea

I will be very grateful for any idea on how to solve that.

 >snip<------8<----------------------------------------------------------------------------

public class OomeTest
{
    /**
     * DOCUMENT_ME!
     *
     * @param args DOCUMENT_ME!
     *
     * @throws Exception DOCUMENT_ME!
     */
    public static void main( String args[] ) throws Exception
    {
        System.setProperty( "derby.language.logStatementText", "true" );
        Class.forName( "org.apache.derby.jdbc.EmbeddedDriver" );
       
        Connection con = DriverManager.getConnection( 
"jdbc:derby:ReproDerby1693DB;create=true;" );
        Statement stmt = con.createStatement(  );
       
        // Try to drop the table, then create.
        try
        {
            stmt.executeUpdate( "drop table blobs" );
        }
        catch ( SQLException sqle )
        {
            if ( !sqle.getSQLState(  ).equals( "42Y55" ) )
            {
                throw sqle;
            }
        }
       
        stmt.executeUpdate( "create table blobs (clobData blob)" );
        stmt.close(  );
       
        byte[] buffer = new byte[6000000];// 6MB
        {
            PreparedStatement pStmt = con.prepareStatement( "insert into 
blobs values (?)" );
            pStmt.setObject( 1, buffer );
            pStmt.executeUpdate(  );
            pStmt.close(  );
            System.out.println( "Success!" );
        }
        {
            PreparedStatement pStmt = con.prepareStatement( "insert into 
blobs values (?)" );
            pStmt.setObject( 1, buffer );
            pStmt.executeUpdate(  );
            pStmt.close(  );
            System.out.println( "Success!" );
        }
        {
            PreparedStatement pStmt = con.prepareStatement( "insert into 
blobs values (?)" );
            pStmt.setObject( 1, buffer );
            pStmt.executeUpdate(  );
            pStmt.close(  );
            System.out.println( "Success!" );
        }
        {
            PreparedStatement pStmt = con.prepareStatement( "insert into 
blobs values (?)" );
            pStmt.setObject( 1, buffer );
            pStmt.executeUpdate(  );
            pStmt.close(  );
            System.out.println( "Success!" );
        }
        {
            PreparedStatement pStmt = con.prepareStatement( "insert into 
blobs values (?)" );
            pStmt.setObject( 1, buffer );
            pStmt.executeUpdate(  );
            pStmt.close(  );
            System.out.println( "Success!" );
        }
        {
            PreparedStatement pStmt = con.prepareStatement( "insert into 
blobs values (?)" );
            pStmt.setObject( 1, buffer );
            pStmt.executeUpdate(  );
            pStmt.close(  );
            System.out.println( "Success!" );
        }
        {
            PreparedStatement pStmt = con.prepareStatement( "insert into 
blobs values (?)" );
            pStmt.setObject( 1, buffer );
            pStmt.executeUpdate(  );
            pStmt.close(  );
            System.out.println( "Success!" );
        }
        con.close(  );
    }
}

Mime
View raw message