cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Harunobu Oyama ...@telensa.com>
Subject Re: auto PK generation in Cayenne 4 + PostgreSQL combination?
Date Fri, 29 Jul 2016 10:13:30 GMT
Michael, John, and Adam,

Thank you for the detailed explanation. It makes perfect sense!
( I did not know the usage and benefit of INCREMENT. )

And I understand the pros and cons caused by the different cache size.

The program is working beautifully now.

nobu



On 29 July 2016 at 11:05, Michael Gentry <blacknext@gmail.com> wrote:

> Hi Nobu,
>
> Some advice on sequences:
>
> 1.1) Change BIGSERIAL to BIGINT.
> 1.2) Create your sequence for a table with an INCREMENT clause, otherwise
> PostgreSQL defaults to 1 which is non-optimal.
> 1.3) Choose "Custom Sequence" in Cayenne Modeler for the PK Generation
> Strategy.
> 1.4) Specify the sequence name you created for your table.
> 1.5) Specify the Cached PK Size, which MUST match your INCREMENT clause
> value.
>
> As to 1.2, the INCREMENT value you choose is more of a black art.  For
> tables with fewer inserts, a lower value is fine, but I'd probably not go
> lower than 5-10.  For high-insert tables, I'd use 20-100 or maybe even more
> depending on your expectations for insert traffic into the table.  The
> Cayenne default of 20 is just a guestimate of a good value.  Double and
> triple check the PostgreSQL/Cayenne values match.  If they do not, things
> will get wonky (I believe that's the technical term).
>
> When using sequences and Cayenne needs a PK and has exhausted the internal
> cache (or the application has recently started and no values have yet been
> cached), then Cayenne must issue a call to PostgreSQL to get the next
> sequence value.  Let's say you are using an INCREMENT of 20, so the
> following happens:
>
> 2.1) Cayenne asks for the next sequence value (DB trip).
> 2.2) PostgreSQL responds with something like 22160.
> 2.3) PostgreSQL internally updates the value of the next sequence value to
> 22180.
> 2.4) Cayenne stores the 22160 and since you told it the Cayenne PK cache
> size is 20, which matches the PostgreSQL INCREMENT value, it won't have to
> ask PostgreSQL (a DB trip) for more PK values again for 20 INSERTs.
> Cayenne will internally increment to 22161, 22162, etc until it hits
> 22179.  This internal caching by Cayenne saves trips to the DB and speeds
> things up.  This is why you don't want to use the default INCREMENT of 1.
>  :-)
> 2.5) When Cayenne's cache is exhausted it'll repeat this process to obtain
> a new cache of PK values, but because other applications can also be
> running against the same DB, this new starting value doesn't have to be
> 22180, but will be whatever the current sequence value is.
>
> As you can imagine, too, having larger increments is likely to introduce
> some gaps into your PK values, especially in non-production environments.
> Every time you stop/start your application, any unused cached PK values are
> effectively lost.  PostgreSQL has already updated the internal value for
> the sequence, which is persistent, and Cayenne will not remember the cached
> values across restarts.  So don't be alarmed if you see gaps while you are
> developing.  This is natural.
>
> mrg
>
>
>
> On Thu, Jul 28, 2016 at 3:11 PM, Harunobu Oyama <ho@telensa.com> wrote:
>
> > uh, ok, so the proper way to use it is something like this?
> >
> >   - on CayenneModeler, choose "Custome Sequence"
> >   - name the Sequence name in any sequence name of my choice
> >   - set Cached PK size to 1 (baring in mind that it can have some
> > performance impact)
> >
> > I will give it a try tomorrow. (sorry, I am going home now.)
> >
> > nobu
> >
> >
> >
> > On 28 July 2016 at 20:05, Adam Boyle <aboyle@valsphere.com> wrote:
> >
> > > The way I have it working is by using a custom sequence for PK
> > generation.
> > > In the dialog to set it up you can choose the "cached PK size" which
> > > determines how many PKs cayenne will grab at a time for a given
> > > transaction. If you set it to 1 it will only grab one at a time, but
> keep
> > > in mind that this could have some performance impact if you tend to
> > create
> > > many records in a single commit.
> > > ________________________________
> > > From: Harunobu Oyama <ho@telensa.com>
> > > Sent: Thursday, July 28, 2016 3:02:07 PM
> > > To: user@cayenne.apache.org
> > > Subject: Re: auto PK generation in Cayenne 4 + PostgreSQL combination?
> > >
> > > Sorry, how should I create the sequence? If Cayenne increments the
> value
> > in
> > > blocks f 20?
> > >
> > > nobu
> > >
> > >
> > > On 28 July 2016 at 19:58, John Huss <johnthuss@gmail.com> wrote:
> > >
> > > > By default cayenne expects the sequence to be incremented in blocks
> of
> > > 20,
> > > > not by 1, so you have to specify that when you create the sequence.
> > > Using
> > > > serial columns is very very small improvement and since support is
> > still
> > > a
> > > > ways off you would be much better off just creating your sequences
> and
> > > > letting cayenne use them.
> > > >
> > > >
> > > > On Thu, Jul 28, 2016 at 1:53 PM Harunobu Oyama <ho@telensa.com>
> wrote:
> > > >
> > > > > It seems "last_value" of "pk_asset" is not updated as expected.
> > > > > It gets incremented only once even if I create 3 asset records
> using
> > > > > Cayenne.
> > > > > It ends up violating asset_PKC constraint.
> > > > >
> > > > >
> > > > > The SQL is like following.
> > > > >
> > > > > create table "asset" (
> > > > >   "asset_id" bigserial not null
> > > > >   , "name" character varying not null
> > > > >   , "latitude" double precision
> > > > >   , "longitude" double precision
> > > > >   , constraint "asset_PKC" primary key ("asset_id")
> > > > > ) ;
> > > > >
> > > > > create sequence "pk_asset"
> > > > >
> > > > > I think it is better to change bigserial to bigint, but does it
> > matter?
> > > > >
> > > > >
> > > > > nobu
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > On 28 July 2016 at 16:15, Michael Gentry <blacknext@gmail.com>
> > wrote:
> > > > >
> > > > > > What do you mean by "out of sync"?  Does it generate duplicate
> PKs?
> > > > How
> > > > > > did you create your sequence?  (Can you show us the SQL for
it?)
> > > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > mrg
> > > > > >
> > > > > >
> > > > > >
> > > > > > On Thu, Jul 28, 2016 at 11:10 AM, Harunobu Oyama <ho@telensa.com
> >
> > > > wrote:
> > > > > >
> > > > > > > If I do not create "pk_asset" sequence, Cayenne 4 throws
an
> > > Exception
> > > > > > > saying it requires it.
> > > > > > > If I create "pk_asset" and let Cayenne 4 assigns the PK
using
> > > > > "pk_asset",
> > > > > > > it looks working fine at a glance, but pk_asset's  last_value
> > gets
> > > > out
> > > > > of
> > > > > > > sync, the next time we launch the program.
> > > > > > > nobu
> > > > > > >
> > > > > > > On 28 July 2016 at 16:05, Michael Gentry <blacknext@gmail.com>
> > > > wrote:
> > > > > > >
> > > > > > > > Well, you can still use PostgreSQL's sequences.  After
all,
> > > that's
> > > > > what
> > > > > > > the
> > > > > > > > "serial" type inherently uses.  No need to manually
set the
> > PKs.
> > > > > > > >
> > > > > > > > mrg
> > > > > > > >
> > > > > > > >
> > > > > > > > On Thu, Jul 28, 2016 at 10:15 AM, Harunobu Oyama <
> > ho@telensa.com
> > > >
> > > > > > wrote:
> > > > > > > >
> > > > > > > > > Thank you Andrus and Michael,
> > > > > > > > >
> > > > > > > > > I will workaround the issue, probably by explicitly
setting
> > the
> > > > > PK's
> > > > > > > from
> > > > > > > > > Java code, until it gets officially supported
by Cayenne
> > then.
> > > > > > > > >
> > > > > > > > > nbou
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > On 28 July 2016 at 15:11, Andrus Adamchik <
> > > > andrus@objectstyle.org>
> > > > > > > > wrote:
> > > > > > > > >
> > > > > > > > > > Good to know this is finally supported on
PG :)
> > > > > > > > > >
> > > > > > > > > > And yeah, we'll still need to patch Cayenne,
so we'll
> also
> > > > > address
> > > > > > PG
> > > > > > > > > > driver specifics.
> > > > > > > > > >
> > > > > > > > > > Andrus
> > > > > > > > > >
> > > > > > > > > > > On Jul 28, 2016, at 5:01 PM, Michael
Gentry <
> > > > > blacknext@gmail.com
> > > > > > >
> > > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > > > > A little Google searching found:
> > > > > > > > > > >
> > > > > > > > > > > https://github.com/pgjdbc/pgjdbc/issues/99
> > > > > > > > > > >
> > > > > > > > > > > This leads me to believe
> > > BatchAction.runAsIndividualQueries()
> > > > > > would
> > > > > > > > > have
> > > > > > > > > > to
> > > > > > > > > > > be changed for PostgreSQL, otherwise
all of the column
> > > values
> > > > > are
> > > > > > > > > > returned
> > > > > > > > > > > instead of just the new PK value.
> > > > > > > > > > >
> > > > > > > > > > > mrg
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > On Thu, Jul 28, 2016 at 9:45 AM, Michael
Gentry <
> > > > > > > blacknext@gmail.com
> > > > > > > > >
> > > > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > > > >> The PostgreSQL documentation says:
> > > > > > > > > > >>
> > > > > > > > > > >> CREATE TABLE tablename (
> > > > > > > > > > >>    colname SERIAL
> > > > > > > > > > >> );
> > > > > > > > > > >>
> > > > > > > > > > >> is equivalent to specifying:
> > > > > > > > > > >>
> > > > > > > > > > >> CREATE SEQUENCE tablename_colname_seq;
> > > > > > > > > > >> CREATE TABLE tablename (
> > > > > > > > > > >>    colname integer NOT NULL DEFAULT
> > > > > > > nextval('tablename_colname_seq')
> > > > > > > > > > >> );
> > > > > > > > > > >> ALTER SEQUENCE tablename_colname_seq
OWNED BY
> > > > > tablename.colname;
> > > > > > > > > > >>
> > > > > > > > > > >>
> > > > > > > > > > >> We'd have to see if the JDBC driver
returns the
> sequence
> > > > value
> > > > > > > > > generated
> > > > > > > > > > >> for the serial column.
> > > > > > > > > > >>
> > > > > > > > > > >> mrg
> > > > > > > > > > >>
> > > > > > > > > > >>
> > > > > > > > > > >>
> > > > > > > > > > >> On Thu, Jul 28, 2016 at 9:10 AM,
Andrus Adamchik <
> > > > > > > > > > andrus@objectstyle.org>
> > > > > > > > > > >> wrote:
> > > > > > > > > > >>
> > > > > > > > > > >>> Back in the day PG driver did
not support
> > autoincremented
> > > > > > values
> > > > > > > at
> > > > > > > > > the
> > > > > > > > > > >>> JDBC level. So we had to always
revert to sequences.
> > > > > > > > > > >>>
> > > > > > > > > > >>> I'd like to run a test to see
if it does now. If the
> > test
> > > > is
> > > > > > > > > > successful,
> > > > > > > > > > >>> we can reconfigure Cayenne
PostgresAdapter to enable
> > > > > > > aoto-increment
> > > > > > > > > > >>> strategy. Will keep the list
posted.
> > > > > > > > > > >>>
> > > > > > > > > > >>> Andrus
> > > > > > > > > > >>>
> > > > > > > > > > >>>
> > > > > > > > > > >>>> On Jul 28, 2016, at 12:48
PM, Harunobu Oyama <
> > > > > ho@telensa.com>
> > > > > > > > > wrote:
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> Hi,
> > > > > > > > > > >>>>
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> What is the proper way
to setup auto PK generation
> > when
> > > > > > Cayenne
> > > > > > > 4
> > > > > > > > +
> > > > > > > > > > >>>> PostgreSQL are in use?
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> Suppose I have a simple
table like this.
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> create table "asset" (
> > > > > > > > > > >>>> "asset_id" bigserial not
null
> > > > > > > > > > >>>> , "name" character varying
not null
> > > > > > > > > > >>>> , constraint "asset_PKC"
primary key ("asset_id")
> > > > > > > > > > >>>> ) ;
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> No matter how I configure
the PK generation
> settings,
> > it
> > > > > seems
> > > > > > > > > Cayenne
> > > > > > > > > > >>>> runtime
> > > > > > > > > > >>>> requires sequence named
"pk_asset".
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> Ideally we would like to
automate the table-sequence
> > > > > > combination
> > > > > > > > by
> > > > > > > > > > >>> using
> > > > > > > > > > >>>> serial/bigserial.
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> How can I tell Cayenne
stop requiring "pk_asset"?
> > > > > > > > > > >>>>
> > > > > > > > > > >>>>
> > > > > > > > > > >>>> thank you,
> > > > > > > > > > >>>> nobu
> > > > > > > > > > >>>
> > > > > > > > > > >>>
> > > > > > > > > > >>
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message