Now _that_ is a bug.  :-)

On 2011-11-10, at 10:09 AM, Alexander Spohr wrote:

> Hi Chuck,
> 
> you have to use useBundledJdbcInfo=true with PostgreSQL. Otherwise your 
> PostgreSQLAdaptor will hold an open transaction into the database. That will 
> prevent commits from getting closed and written (kicking the old values), 
> therefore bloating your database and finally kill your performance.
> 
> We learned the hard way.
> 
>       atze
> 
> 
> Am 09.11.2011 um 23:39 schrieb Chuck Hill:
> 
>> Hi Lars,
>> 
>> Can you check your connection URL?  It should not be using that file, that 
>> is mostly for Entity Modeler to generate the schema in the absence of a 
>> database connection.
>> 
>> See:
>> 
>> /**
>>  * <P>This method returns true if the connection URL for the
>>  * database has a special flag on it which indicates to the
>>  * system that the jdbcInfo which has been bundled into the
>>  * plugin is acceptable to use in place of actually going to
>>  * the database and getting it.
>>  */
>> protected boolean shouldUseBundledJdbcInfo() {
>>   boolean shouldUseBundledJdbcInfo = false;
>>   String url = connectionURL();
>>   if (url != null) {
>>     shouldUseBundledJdbcInfo = url.toLowerCase().matches(".*(\\?|\\?.*&)" + 
>> PostgresqlPlugIn.QUERY_STRING_USE_BUNDLED_JDBC_INFO.toLowerCase() + 
>> "=(true|yes)(\\&|$)");
>>   }
>>   return shouldUseBundledJdbcInfo;
>> }
>> 
>> 
>> private static final String QUERY_STRING_USE_BUNDLED_JDBC_INFO = 
>> "useBundledJdbcInfo";
>> 
>> 
>> 
>> Chuck
>> 
>> 
>> On 2011-11-09, at 11:41 AM, Lars Sonchocky-Helldorf wrote:
>> 
>>> 
>>> Am 08.11.2011 um 20:56 schrieb Lars Sonchocky-Helldorf:
>>> 
>>>> Hi folks!
>>>> 
>>>> 
>>>> For reason not to be discussed here my coworker has created a PostgreSQL 9 
>>>> database table like follows:
>>>> 
>>>> CREATE TABLE systemmessagecontent
>>>> (
>>>> id integer NOT NULL,
>>>> "language" character(2) NOT NULL,
>>>> message text NOT NULL,
>>>> subject character varying(255) NOT NULL,
>>>> systemmessageid integer NOT NULL,
>>>> CONSTRAINT systemmessagecontent_pkey PRIMARY KEY (id),
>>>> CONSTRAINT systemmessagecontent_systemmessage_fk FOREIGN KEY 
>>>> (systemmessageid)
>>>>   REFERENCES systemmessage (id) MATCH SIMPLE
>>>>   ON UPDATE NO ACTION ON DELETE NO ACTION
>>>> )
>>>> 
>>>> The interesting point here is column "language" which is a two character 
>>>> fixed string. 
>>>> 
>>>> In the corresponding EOModel the property for this has "char" as External 
>>>> Type and an External Width of 2 and no prototype (since there is nothing 
>>>> matching).
>>>> 
>>>> 
>>>> 
>>>> When running the application and trying to update that property/column the 
>>>> following SQL is generated:
>>>> 
>>>> Nov 08 18:28:34 BKAdmin[55555] DEBUG NSLog  -  === Begin Internal 
>>>> Transaction
>>>> Nov 08 18:28:34 BKAdmin[55555] DEBUG NSLog  -  evaluateExpression: 
>>>> <com.webobjects.jdbcadaptor.PostgresqlExpression: "UPDATE 
>>>> SystemMessageContent SET language = ?::char WHERE (id = ?::int4 AND 
>>>> systemMessageID = ?::int4)" withBindings: 1:"de"(language), 2:28(id), 
>>>> 3:48(systemMessageID)>
>>>> Nov 08 18:28:34 BKAdmin[55555] DEBUG NSLog  -  === Commit Internal 
>>>> Transaction
>>>> 
>>>> Remarkable here is the "?::char" Obviously this is a cast into a single 
>>>> character type of PostgreSQL. 
>>>> 
>>>> see http://www.postgresql.org/docs/9.1/interactive/datatype-character.html 
>>>> table 8-5 for this.
>>>> 
>>>> 
>>>> 
>>>> Correct would have been to use character(2) or char(2) as my tests with 
>>>> PGAdmin revealed:
>>>> 
>>>> At first I fired the following SQL:
>>>> 
>>>> UPDATE SystemMessageContent SET language = 'de'::char WHERE (id = 28::int4 
>>>> AND systemMessageID = 48::int4)
>>>> 
>>>> The result was the same like the one from the WOApp itself, after updating 
>>>> the database contained this: "d "
>>>> 
>>>> 
>>>> When I changed the query accordingly ('de'::char to 'de'::char(2)) I got 
>>>> what I expected:
>>>> 
>>>> UPDATE SystemMessageContent SET language = 'de'::char(2) WHERE (id = 
>>>> 28::int4 AND systemMessageID = 48::int4)
>>>> 
>>>> After this the database  contained a "de".
>>>> 
>>>> 
>>>> Trying to use "char(2)" as External Type in my EOModel (instead of "char") 
>>>> I've got the following exception:
>>>> 
>>>> Nov 08 18:40:36 BKAdmin[55555] WARN  NSLog  - *** JDBCAdaptor : no type 
>>>> info found for char(2)
>>>> Nov 08 18:40:36 BKAdmin[55555] DEBUG NSLog  -  === Begin Internal 
>>>> Transaction
>>>> Nov 08 18:46:49 BKAdmin[55555] INFO  er.transaction.adaptor.Exceptions  - 
>>>> Database Exception occured: 
>>>> com.webobjects.eoaccess.EOGeneralAdaptorException: Unable to find type 
>>>> information for external type 'char(2)' in attribute 'language' of entity 
>>>> 'SystemMessageContent'.  Check spelling and capitalization.
>>>> 
>>>> 
>>>> Now I think that maybe "char" was the right External Type to begin with. 
>>>> Only the JDBCAdaptor did not respect the external with of "2" and did not 
>>>> mangle "char" into "char(2)"
>>>> 
>>>> 
>>>> Is there something I can do about this?
>>> 
>>> Adding the following to PostgresqlPlugIn.framework/Resources/JDBCInfo.plist:
>>> 
>>>             "character" = {
>>>                     "defaultJDBCType" = (
>>>                             "CHAR"
>>>                     );
>>>                     "createParams" = "1";
>>>                     "maxScale" = "0";
>>>                     "minScale" = "0";
>>>                     "isNullable" = "T";
>>>                     "isSearchable" = "T";
>>>                     "precision" = "10485760";
>>>             };
>>> 
>>> and setting "character" as External Type in the corresponding EOModel did 
>>> help.
>>> 
>>> The result then is:
>>> 
>>> Nov 09 13:13:18 BKAdmin[55555] DEBUG NSLog  -  === Begin Internal 
>>> Transaction
>>> Nov 09 13:13:18 BKAdmin[55555] DEBUG NSLog  -  evaluateExpression: 
>>> <com.webobjects.jdbcadaptor.PostgresqlExpression: "UPDATE 
>>> SystemMessageContent SET language = ?::character(2) WHERE (id = ?::int4 AND 
>>> systemMessageID = ?::int4)" withBindings: 1:"de"(language), 2:28(id), 
>>> 3:48(systemMessageID)>
>>> Nov 09 13:13:18 BKAdmin[55555] DEBUG NSLog  -  === Commit Internal 
>>> Transaction
>>> 
>>> Could somebody with commit access to the PostgresqlPlugIn.framework please 
>>> add this code upstream?
>>> 
>>> 
>>> 
>>> cheers,
>>> 
>>>     Lars _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Webobjects-dev mailing list      ([email protected])
>>> Help/Unsubscribe/Update your Subscription:
>>> http://lists.apple.com/mailman/options/webobjects-dev/chill%40global-village.net
>>> 
>>> This email sent to [email protected]
>> 
>> -- 
>> Chuck Hill             Senior Consultant / VP Development
>> 
>> Practical WebObjects - for developers who want to increase their overall 
>> knowledge of WebObjects or who are trying to solve specific problems.    
>> http://www.global-village.net/products/practical_webobjects
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      ([email protected])
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/atze%40freeport.de
>> 
>> This email sent to [email protected]
> 

-- 
Chuck Hill             Senior Consultant / VP Development

Practical WebObjects - for developers who want to increase their overall 
knowledge of WebObjects or who are trying to solve specific problems.    
http://www.global-village.net/products/practical_webobjects







 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to