Re: [HACKERS] JDBC adaptor issue - Mailing list pgsql-jdbc

From Barry Lind
Subject Re: [HACKERS] JDBC adaptor issue
Date
Msg-id 3B37BFDD.5030200@xythos.com
Whole thread Raw
In response to Re: [HACKERS] JDBC adaptor issue  (Barry Lind <barry@xythos.com>)
List pgsql-jdbc
 This is an interesting problem.  And I can't think a any easy
 solution.  But given TOAST in 7.1 the existing implementation doesn't
 make sense IMHO  My suggestion would be that the get/setXXXStream
 methods work on TOASTed data types and get/setBlob be used for Blobs.

 As far as your patch, I don't see that as a generic solution.  It is
 equally likely that a Blob could contain less than 8190 characters, or
 a varchar could contain more that 8190 characters in 7.1.  Using this
 number as a magic switch to decide whether the driver uses the BLOB
 API or not just won't work in the general case.

 thanks,
 --Barry

>>
>> btoback@mac.com wrote:
>>
>>> Hi all,
>>>
>>> I've been trying to get PostgreSQL to work with Apple's WebObjects
>>> application server. WebObjects uses JDBC as an interface to back-end
>>> databases, translating between SQL and a pure object model.
>>>
>>> I had a problem with incorrect SQL being generated and sent to the
>>> PostgreSQL back end. After some work, I tracked it down. I have a
>>> fix, but the fix has ramifications for the way that others use
>>> PostgreSQL, so I decided to post here and see what people think.
>>>
>>> It turns out that WebObjects uses the
>>> PreparedStatement.setCharacterStream method in order to set the
>>> values of some character parameters in prepared statements, and thus
>>> the generated SQL. It's not at all clear why it does this for some
>>> parameters but not others; the reason doesn't seem to have anything
>>> to do with the declared length of the parameters. This seems odd,
>>> because setCharacterStream is a very high-overhead operation, but in
>>> any case, that's what it does.
>>>
>>> The PostgreSQL JDBC driver, however, makes the assumption that any
>>> JDBC client class that's using the set/get...stream methods wants to
>>> exchange information with a field that's been explicitly typed as a
>>> BLOB. It therefore does what PostgreSQL requires: it creates a new
>>> object containing the data, then uses the object ID of the new object
>>> as the value to stuff into the query. This has the effect of
>>> generating queries like
>>>
>>>    SELECT ...
>>>     WHERE some_text_field = 57909 ...
>>>
>>> 57909 is an object ID. The comparison doesn't work because
>>> some_text_field is an ordinary char or varchar, not a BLOB.
>>>
>>> It's kind of hard to figure out the "right" solution to this problem.
>>> I've patched the PostgreSQL JDBC implementation of
>>> PreparedStatement.setCharacterStream to treat any stream smaller than
>>> 8190 bytes as a string. I chose 8190 because of the old limit of 8192
>>> bytes per tuple in versions prior to 7.1, so this change is least
>>> likely to cause compatibility problems with systems using
>>> setCharacterStream the way that the PostgreSQL developers
>>> anticipated. I can provide the patch to anyone who needs it.
>>>
>>> The WebObjects use of JDBC is in line with the JDBC 2.0
>>> specification; that spec does not place any restrictions on the types
>>> of fields that can be accessed via get/set...stream. Whether it's a
>>> good use is a different question, of course, but it's still legal. My
>>> little kludge with an 8190-byte "switch" to the old behavior really
>>> can't be the last word.
>>>
>>> I was hoping that someone could look at the PostgreSQL back end to
>>> see if there's any reason to keep the 8190-byte limiting behavior in
>>> the JDBC driver. The limit needs to be removed so that character
>>> streams and strings are symmetric in order to comply with JDBC 2.0.
>>> The effect of switching will simply be the possibility that the back
>>> end will have to deal with very long (>8k) quoted strings. I got the
>>> impression from reading TOAST project documents that all such
>>> limitations had been removed, but I wanted to check before submitting
>>> my patch for inclusion in the distribution.
>>>
>>> Thanks,
>>> -- Bruce
>>>
>>> --------------------------------------------------------------------------
>>>
>>> Bruce Toback    Tel: (602) 996-8601| My candle burns at both ends;
>>> OPT, Inc.            (800) 858-4507| It will not last the night;
>>> 11801 N. Tatum Blvd. Ste. 142      | But ah, my foes, and oh, my
>>> friends -
>>> Phoenix AZ 85028                   | It gives a lovely light.
>>> btoback@optc.com                   |     -- Edna St. Vincent Millay
>>>
>>> ---------------------------(end of broadcast)---------------------------
>>> TIP 3: if posting/reading through Usenet, please send an appropriate
>>> subscribe-nomail command to majordomo@postgresql.org so that your
>>> message can get through to the mailing list cleanly
>>>
>>
>>
>
>



pgsql-jdbc by date:

Previous
From: Barry Lind
Date:
Subject: Re: [ADMIN] High memory usage [PATCH]
Next
From: "Dave Cramer"
Date:
Subject: RE: [ADMIN] High memory usage [PATCH]