cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Gentry <blackn...@gmail.com>
Subject Re: auto PK generation in Cayenne 4 + PostgreSQL combination?
Date Fri, 29 Jul 2016 10:05:44 GMT
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