Thread: NPE in BlobInputStream

NPE in BlobInputStream

From
matrixx
Date:
Hi,

im using the postgresql-8.1-407.jdbc3.jar driver over hibernate 3 to
access databases.

Our application currently runs with mysql and mssql drivers without any
problems. With the postgresql driver i get the following exception:

[ModuleProfile.deserialize@AWT-EventQueue-0] ERROR: Error deserializing
blob.
java.lang.NullPointerException
    at
org.postgresql.largeobject.BlobInputStream.close(BlobInputStream.java:115)
    at java.beans.XMLDecoder.close(XMLDecoder.java:152)
    ...

I dont know if its a driver bug, or a hibernate issue.


Thanks for any help
JR




Re: NPE in BlobInputStream

From
Kris Jurka
Date:

On Fri, 24 Nov 2006, matrixx wrote:

> im using the postgresql-8.1-407.jdbc3.jar driver over hibernate 3 to access
> databases.
>
> Our application currently runs with mysql and mssql drivers without any
> problems. With the postgresql driver i get the following exception:
>
> [ModuleProfile.deserialize@AWT-EventQueue-0] ERROR: Error deserializing blob.
> java.lang.NullPointerException
>     at
> org.postgresql.largeobject.BlobInputStream.close(BlobInputStream.java:115)
>     at java.beans.XMLDecoder.close(XMLDecoder.java:152)
>     ...
>
> I dont know if its a driver bug, or a hibernate issue.
>

It's a driver bug that's caused by one of two possible issues.  It's
impossible to tell which from this stacktrace alone.

1) The BlobInputStream is violating the contract of the close method that
allows you to call it more than once.

2) You've called getInputStream more than once on a Blob and it can't
handle two streams simultaneously.

I've produced a fix for 1 and a very simple version of 2.  Could you try
out this jar file and let me know if it works:

http://www.ejurka.com/pgsql/jars/mx/

Kris Jurka

Attachment

Re: NPE in BlobInputStream

From
matrixx
Date:
Kris Jurka schrieb:
>
>
> On Fri, 24 Nov 2006, matrixx wrote:
>
>> im using the postgresql-8.1-407.jdbc3.jar driver over hibernate 3 to
>> access databases.
>>
>> Our application currently runs with mysql and mssql drivers without
>> any problems. With the postgresql driver i get the following exception:
>>
>> [ModuleProfile.deserialize@AWT-EventQueue-0] ERROR: Error
>> deserializing blob.
>> java.lang.NullPointerException
>>     at
>> org.postgresql.largeobject.BlobInputStream.close(BlobInputStream.java:115)
>>
>>     at java.beans.XMLDecoder.close(XMLDecoder.java:152)
>>     ...
>>
>> I dont know if its a driver bug, or a hibernate issue.
>>
>
> It's a driver bug that's caused by one of two possible issues.  It's
> impossible to tell which from this stacktrace alone.
>
> 1) The BlobInputStream is violating the contract of the close method
> that allows you to call it more than once.
>
> 2) You've called getInputStream more than once on a Blob and it can't
> handle two streams simultaneously.
>
> I've produced a fix for 1 and a very simple version of 2.  Could you try
> out this jar file and let me know if it works:
>

building the 8.1_407 failed cause i'm using jdk1.6.
But i was able to apply and build the patch on 8.2devel.

The NPE is gone there.

The getBinaryStream() is called only once from my side.
The code for accessing the blob simply is:

  ...
  InputStream is = blob.getBinaryStream();
  XMLDecoder decoder = new XMLDecoder(is);
  config = (ModuleProfile) decoder.readObject();
  decoder.close();
  ...

(The blob is from a Hibernate data object).

JR

Re: NPE in BlobInputStream

From
Kris Jurka
Date:

On Sun, 26 Nov 2006, Kris Jurka wrote:

> On Fri, 24 Nov 2006, matrixx wrote:
>
>> im using the postgresql-8.1-407.jdbc3.jar driver over hibernate 3 to access
>> databases.
>>
>> Our application currently runs with mysql and mssql drivers without any
>> problems. With the postgresql driver i get the following exception:
>>
>> [ModuleProfile.deserialize@AWT-EventQueue-0] ERROR: Error deserializing
>> blob.
>> java.lang.NullPointerException
>>     at
>> org.postgresql.largeobject.BlobInputStream.close(BlobInputStream.java:115)
>>     at java.beans.XMLDecoder.close(XMLDecoder.java:152)
>>     ...
>>
>> I dont know if its a driver bug, or a hibernate issue.
>>
>
> It's a driver bug that's caused by one of two possible issues.  It's
> impossible to tell which from this stacktrace alone.
>
> 1) The BlobInputStream is violating the contract of the close method that
> allows you to call it more than once.
>
> 2) You've called getInputStream more than once on a Blob and it can't handle
> two streams simultaneously.
>

I've applied a more complete fix for these issues to CVS HEAD.

Kris Jurka