Re: getGeneratedKeys method - Mailing list pgsql-jdbc

From Ceki Gulcu
Subject Re: getGeneratedKeys method
Date
Msg-id 20040527135029.34444.qmail@web51003.mail.yahoo.com
Whole thread Raw
In response to Re: getGeneratedKeys method  (Oliver Jowett <oliver@opencloud.com>)
Responses Re: getGeneratedKeys method
List pgsql-jdbc
Hi Oliver,

The increment by N aproach, where N < batch size, is
imho very original. It should work but the DBAppender
code has to be compatible with different RDBMSs. The
approach you suggest assumes that we can manually set
event_id, which is not necessarily always the case, or
maybe it is, but I am not sure. More importantly, on
some RDBMS we are using auto-generated keys where it
is not always possible to set the increment value.
(Maybe it is always possible, I'll have to check that
too.)

Anyway, I now know when an increment value other than
1 could be useful.

Thanks again for your help.

--- Oliver Jowett <oliver@opencloud.com> wrote:
> Ceki Gulcu wrote:
> > Hello,
> >
> > Thanks for all the replies received so far. I
> really
> > appreciate it.
> >
> > One important point I failed to mention in my
> original
> > mail, was that we are using a prepared statement
> to
> > perform the initial batch of inserts via
> executeBatch,
> > followed by another prepared statement and
> invoking
> > executeBatch and a third prepared
> > statement+executeBatch.
> >
> > Your suggestions imply the use of regular
> statements
> > as opposed to prepared statements. I don't know
> > whether the performance boost is due to the use of
> > prepared statements or whether it's more the
> > "batching", that is regrouping the SQL statements
> in
> > one transaction.
>
> I initially thought you could batch the inserts in
> the approach I
> suggested, but of course addBatch and executeBatch
> live on a particular
> PreparedStatement so you can't do that.
>
> Ok, how about something like this instead:
>
>    CREATE SEQUENCE id INCREMENT BY 100;
>
> Then limit batch size to 100, and for each batch do:
>
>    SELECT nextval('id')
>    -- let's assume this returns 1000
>
> Next do the actual batch inserts, grouped by
> statement and computing ID
> values yourself based on the returned nextval +
> offset:
>
>    INSERT INTO logging_event VALUES (1000, ...)
>    INSERT INTO logging_event VALUES (1001, ...)
>    INSERT INTO logging_event VALUES (1002, ...)
>    -- ...
>    INSERT INTO logging_event VALUES (1099, ...)
>
>    INSERT INTO logging_event_property VALUES (1000,
> 'foo', ...)
>    INSERT INTO logging_event_property VALUES (1000,
> 'bar', ...)
>    INSERT INTO logging_event_property VALUES (1001,
> 'foo', ...)
>    INSERT INTO logging_event_property VALUES (1001,
> 'bar', ...)
>    -- etc
>
>    INSERT INTO logging_event_exception VALUES (1000,
> 'line 1', ...)
>    INSERT INTO logging_event_exception VALUES (1000,
> 'line 2', ...)
>    INSERT INTO logging_event_exception VALUES (1001,
> 'line 1', ...)
>    INSERT INTO logging_event_exception VALUES (1001,
> 'line 2', ...)
>    -- etc
>
> Because of the INCREMENT BY clause, the generated
> IDs won't collide with
> another concurrent inserter. This should let you use
> both
> PreparedStatement and batch execution I think.
>
> There is a tradeoff between rate of ID consumption
> and maximum batch
> size to be made, but if you're using int8 for IDs
> then ID consumption is
> unlikely to be an issue..
>
> -O





__________________________________
Do you Yahoo!?
Friends.  Fun.  Try the all-new Yahoo! Messenger.
http://messenger.yahoo.com/

pgsql-jdbc by date:

Previous
From: Oliver Jowett
Date:
Subject: Re: getGeneratedKeys method
Next
From: Dave Cramer
Date:
Subject: Re: getGeneratedKeys method