OutofMemory Error when reading large blob when statement type is 
ResultSet.TYPE_SCROLL_INSENSITIVE
--------------------------------------------------------------------------------------------------

         Key: DERBY-802
         URL: http://issues.apache.org/jira/browse/DERBY-802
     Project: Derby
        Type: Bug
  Components: JDBC  
    Versions: 10.0.2.0, 10.0.2.1, 10.1.1.0, 10.1.1.1, 10.1.1.2, 10.1.2.0, 
10.1.2.1, 10.2.0.0, 10.1.3.0, 10.1.2.2, 10.0.2.2    
 Environment: all
    Reporter: Sunitha Kambhampati


Grégoire Dubois on the list reported this problem.  From his mail: the 
reproduction is attached below. 
When statement type is set to ResultSet.TYPE_SCROLL_INSENSITIVE, outofmemory 
exception is thrown when reading large blobs. 

import java.sql.*;
import java.io.*;

/**
*
* @author greg
*/
public class derby_filewrite_fileread {
   
    private static File file = new 
File("/mnt/BigDisk/Clips/BabyMamaDrama-JShin.wmv");
    private static File destinationFile = new 
File("/home/greg/DerbyDatabase/"+file.getName());
   
    /** Creates a new instance of derby_filewrite_fileread */
    public derby_filewrite_fileread() {       
       
    }
   
    public static void main(String args[]) {
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
            Connection connection = DriverManager.getConnection 
("jdbc:derby:/home/greg/DerbyDatabase/BigFileTestDB;create=true", "APP", "");
            connection.setAutoCommit(false);
           
            Statement statement = 
connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
ResultSet.CONCUR_READ_ONLY);
            ResultSet result = statement.executeQuery("SELECT TABLENAME FROM 
SYS.SYSTABLES");
           
            // Create table if it doesn't already exists.
            boolean exist=false;
            while ( result.next() ) {
                if ("db_file".equalsIgnoreCase(result.getString(1)))
                    exist=true;
            }
            if ( !exist ) {
                System.out.println("Create table db_file.");
                statement.execute("CREATE TABLE db_file ("+
                                           "     name          VARCHAR(40),"+
                                           "     file          BLOB(2G) NOT 
NULL)");
                connection.commit();
            }
           
            // Read file from disk, write on DB.
            System.out.println("1 - Read file from disk, write on DB.");
            PreparedStatement 
preparedStatement=connection.prepareStatement("INSERT INTO db_file(name,file) 
VALUES (?,?)");
            FileInputStream fileInputStream = new FileInputStream(file);
            preparedStatement.setString(1, file.getName());
            preparedStatement.setBinaryStream(2, fileInputStream, 
(int)file.length());           
            preparedStatement.execute();
            connection.commit();
            System.out.println("2 - END OF Read file from disk, write on DB.");
           
           
            // Read file from DB, and write on disk.
            System.out.println("3 - Read file from DB, and write on disk.");
            result = statement.executeQuery("SELECT file FROM db_file WHERE 
name='"+file.getName()+"'");
            byte[] buffer = new byte [1024];
            result.next();
            BufferedInputStream     inputStream=new 
BufferedInputStream(result.getBinaryStream(1),1024);
            FileOutputStream outputStream = new 
FileOutputStream(destinationFile);
            int readBytes = 0;
            while (readBytes!=-1) {
                readBytes=inputStream.read(buffer,0,buffer.length);
                if ( readBytes != -1 )
                    outputStream.write(buffer, 0, readBytes);
            }     
            inputStream.close();
            outputStream.close();
            System.out.println("4 - END OF Read file from DB, and write on 
disk.");
        }
        catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }
}


It returns
1 - Read file from disk, write on DB.
2 - END OF Read file from disk, write on DB.
3 - Read file from DB, and write on disk.
java.lang.OutOfMemoryError
if the file is ~10MB or more

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to