Re: Using bytea with ResultSet.getBytes("..."). Problem. Help!! - Mailing list pgsql-jdbc
From | Dave Cramer |
---|---|
Subject | Re: Using bytea with ResultSet.getBytes("..."). Problem. Help!! |
Date | |
Msg-id | 132229BF-6B73-4818-A6C0-49E1DB5D9821@fastcrypt.com Whole thread Raw |
In response to | Using bytea with ResultSet.getBytes("..."). Problem. Help!! ("roman" <xroot@mail.ru>) |
List | pgsql-jdbc |
On 19-Jul-07, at 12:20 AM, roman wrote:
The driver has to take it all into memory, so if you don't have enough memory for the file, you will run out of memory.Hello!(I use Netbeans 5.5, Jdk 1.6, postgreSql 8.1.5 on linux host).I have a problem with reading big binary data from BYTEA field.I write to it about 16MB pdf file (as byte[] array) sucessfully, but when I try to read it back I have an exception:Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
at org.postgresql.util.PGbytea.toBytes(PGbytea.java:53)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBytes(AbstractJdbc2ResultSet.java:2152)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBinaryStream(AbstractJdbc2ResultSet.java:2272)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBinaryStream(AbstractJdbc2ResultSet.java:2367)I have no problem with files about 1MB.
My code for writing object:...java.sql.PreparedStatement insAttachment=connection.prepareStatement("INSERT INTO \"T_Table\" (\"f_InitialDocument\") VALUES (?)"); //f_InitialDocument is a BYTEA field...public void insertAttachment(String FILENAME) {
byte[] buf=null;
try {
//first read file to buf
java.io.File f=new java.io.File(FILENAME);
if(f.exists() && f.canRead()) {
java.io.RandomAccessFile raf=new java.io.RandomAccessFile(f, "r");
buf=new byte[(int)raf.length()];
raf.readFully(buf);
raf.close();
//Write it to database
insAttachment.setBytes(1, buf);
insAttachment.execute();
} else { ret=false; }
} catch(Exception e) {
ret=false;
}
}My code for reading object:...String query="SELECT \"f_InitialDocument\" FROM \"T_Attachments\"";
java.sql.ResultSet rs=database.executeFastQuery(query); //My function for executing query which gives java.sql.ResultSet
if(rs!=null) {
try {
if(rs.next()) {
byte[] buf=rs.getBytes("f_InitialDocument"); //HERE I GOT THAT EXCEPTION ABOUT OutOfMemory!!!
//Create a template file
String filename=database.getTempFilename(); //Function for generating temporary filenames basing on GUID
java.io.File f=new java.io.File(filename);
if(f.createNewFile()) {
java.io.FileOutputStream fos=new java.io.FileOutputStream(f);
fos.write(buf);
fos.close();
database.executeCommand(filename); //function for opening file in appropiate application
}
}
} catch(Exception e){}
}
...I tried to launch my program with options: -Xmx800M -Xms1500M, but it didn't help...I tried to use: java.io.InputStream is=rs.getBinaryStream("f_InitialDocument"); but got the same error in this string in debugger.How can I read such big objects???Please help me.Roman.
pgsql-jdbc by date: