You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by "LYALIKOV, OLEG (OLEG)** CTR **" <ol...@alcatel-lucent.com> on 2011/05/19 14:28:09 UTC

Query cache eviction problem with InheritanceType.TABLE_PER_CLASS

Hello,
I'm using openjpa-2.0.0 and have some base class

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Base { ... }

and also some inheritors

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class A extends Base { ... }

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class B extends Base { ... }

Base class has some fields which are used as in A as in B class but these fields are in separate tables (for A and B class) with no common table.

The problem is: if I have cached query involving A class and then I create/update/delete object of B class then I get invalidated query for class A because both A and B class have common persistent class Base and openjpa decides that changing object of class B affects cached queries involving class A which is not true (I have two separate tables - one for A and one for B class).

This is significant problem for me because I have lots of inheritors of Base class and all these inheritors have own table and don't have some common table and these query cache invalidates slow system.

Is there any workaround? I tried extending QueryCache implementations but with no success (for example removing Base class from access path of QueryKey object didn't help because of some other realization details of QueryKey object which I can't change)

RE: Query cache eviction problem with InheritanceType.TABLE_PER_CLASS

Posted by "LYALIKOV, OLEG (OLEG)** CTR **" <ol...@alcatel-lucent.com>.
Thanks Mike
I created improvement task: https://issues.apache.org/jira/browse/OPENJPA-2002
Also included junit test but it runs successfully - I couldn't make it failing. So the interesting part in test is openjpa logs which demonstrate sql executing while query result should be cached.

Thanks
Oleg

-----Original Message-----
From: Michael Dick [mailto:michael.d.dick@gmail.com] 
Sent: Monday, May 23, 2011 11:20 PM
To: users@openjpa.apache.org
Subject: Re: Query cache eviction problem with InheritanceType.TABLE_PER_CLASS

Hi Oleg,

I don't think there's a workaround available. This sounds like a good
candidate for an improvement though. Could you open a JIRA
issue<https://issues.apache.org/jira/browse/OPENJPA>,
and vote for it?

The model you listed in your first email to the list should reproduce the
problem, but if you can include a unit test as well that will probably
help.

-mike

On Fri, May 20, 2011 at 2:04 AM, LYALIKOV, OLEG (OLEG)** CTR ** <
oleg.lyalikov@alcatel-lucent.com> wrote:

> Thanks for reply Kevin.
> Actually there are no any exceptions or errors.
>
> Imagine situation: you have a query "SELECT x FROM A WHERE x.title = 'Some
> title'". You execute this query a lot of times so openjpa can return cached
> query result (I assume this is QueryCache).
>
> But then you for example create new object of type B.
> After create openjpa checks cached queries and finds query "SELECT x FROM A
> WHERE x.title = 'Some title'" which access path (field _accessPathClassNames
> in QueryKey class) contains class A and class Base and this access path
> intersects with access path of create query (it contains class B and class
> Base).
> So openjpa decides to remove query "SELECT x FROM A WHERE x.title = 'Some
> title'" result from cache and when you run this query next time openjpa
> accesses database.
>
> But entity Base doesn't have own table, its fields are contained as in
> table A as in table B and tables A and B don't intersect.
> So decision to remove query "SELECT x FROM A WHERE x.title = 'Some title'"
> result from cache after creating object of class B seems wrong to me.
>
> Openjpa considers entities A and B intersect through their base persistent
> entity Base but actually they don't intersect.
>
> Thanks
> Oleg
>
> -----Original Message-----
> From: Kevin Sutter [mailto:kwsutter@gmail.com]
> Sent: Thursday, May 19, 2011 7:30 PM
> To: users@openjpa.apache.org
> Subject: Re: Query cache eviction problem with
> InheritanceType.TABLE_PER_CLASS
>
> HI Oleg,
> Can you post the specific exception or error condition you are referring
> to?  OpenJPA utilizes several caches.  It sounds like you might be
> referring
> to the QuerySQLCache not being able to cache the generated SQL.  This is
> different from the QueryCache which caches the results of various Queries.
> Just trying to clarify which cache you are experiencing problems with.
>
> Thanks,
> Kevin
>
> On Thu, May 19, 2011 at 7:28 AM, LYALIKOV, OLEG (OLEG)** CTR ** <
> oleg.lyalikov@alcatel-lucent.com> wrote:
>
> > Hello,
> > I'm using openjpa-2.0.0 and have some base class
> >
> > @Entity
> > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> > public abstract class Base { ... }
> >
> > and also some inheritors
> >
> > @Entity
> > @Inheritance(strategy = InheritanceType.JOINED)
> > public class A extends Base { ... }
> >
> > @Entity
> > @Inheritance(strategy = InheritanceType.JOINED)
> > public class B extends Base { ... }
> >
> > Base class has some fields which are used as in A as in B class but these
> > fields are in separate tables (for A and B class) with no common table.
> >
> > The problem is: if I have cached query involving A class and then I
> > create/update/delete object of B class then I get invalidated query for
> > class A because both A and B class have common persistent class Base and
> > openjpa decides that changing object of class B affects cached queries
> > involving class A which is not true (I have two separate tables - one for
> A
> > and one for B class).
> >
> > This is significant problem for me because I have lots of inheritors of
> > Base class and all these inheritors have own table and don't have some
> > common table and these query cache invalidates slow system.
> >
> > Is there any workaround? I tried extending QueryCache implementations but
> > with no success (for example removing Base class from access path of
> > QueryKey object didn't help because of some other realization details of
> > QueryKey object which I can't change)
> >
>

Re: Query cache eviction problem with InheritanceType.TABLE_PER_CLASS

Posted by Michael Dick <mi...@gmail.com>.
Hi Oleg,

I don't think there's a workaround available. This sounds like a good
candidate for an improvement though. Could you open a JIRA
issue<https://issues.apache.org/jira/browse/OPENJPA>,
and vote for it?

The model you listed in your first email to the list should reproduce the
problem, but if you can include a unit test as well that will probably
help.

-mike

On Fri, May 20, 2011 at 2:04 AM, LYALIKOV, OLEG (OLEG)** CTR ** <
oleg.lyalikov@alcatel-lucent.com> wrote:

> Thanks for reply Kevin.
> Actually there are no any exceptions or errors.
>
> Imagine situation: you have a query "SELECT x FROM A WHERE x.title = 'Some
> title'". You execute this query a lot of times so openjpa can return cached
> query result (I assume this is QueryCache).
>
> But then you for example create new object of type B.
> After create openjpa checks cached queries and finds query "SELECT x FROM A
> WHERE x.title = 'Some title'" which access path (field _accessPathClassNames
> in QueryKey class) contains class A and class Base and this access path
> intersects with access path of create query (it contains class B and class
> Base).
> So openjpa decides to remove query "SELECT x FROM A WHERE x.title = 'Some
> title'" result from cache and when you run this query next time openjpa
> accesses database.
>
> But entity Base doesn't have own table, its fields are contained as in
> table A as in table B and tables A and B don't intersect.
> So decision to remove query "SELECT x FROM A WHERE x.title = 'Some title'"
> result from cache after creating object of class B seems wrong to me.
>
> Openjpa considers entities A and B intersect through their base persistent
> entity Base but actually they don't intersect.
>
> Thanks
> Oleg
>
> -----Original Message-----
> From: Kevin Sutter [mailto:kwsutter@gmail.com]
> Sent: Thursday, May 19, 2011 7:30 PM
> To: users@openjpa.apache.org
> Subject: Re: Query cache eviction problem with
> InheritanceType.TABLE_PER_CLASS
>
> HI Oleg,
> Can you post the specific exception or error condition you are referring
> to?  OpenJPA utilizes several caches.  It sounds like you might be
> referring
> to the QuerySQLCache not being able to cache the generated SQL.  This is
> different from the QueryCache which caches the results of various Queries.
> Just trying to clarify which cache you are experiencing problems with.
>
> Thanks,
> Kevin
>
> On Thu, May 19, 2011 at 7:28 AM, LYALIKOV, OLEG (OLEG)** CTR ** <
> oleg.lyalikov@alcatel-lucent.com> wrote:
>
> > Hello,
> > I'm using openjpa-2.0.0 and have some base class
> >
> > @Entity
> > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> > public abstract class Base { ... }
> >
> > and also some inheritors
> >
> > @Entity
> > @Inheritance(strategy = InheritanceType.JOINED)
> > public class A extends Base { ... }
> >
> > @Entity
> > @Inheritance(strategy = InheritanceType.JOINED)
> > public class B extends Base { ... }
> >
> > Base class has some fields which are used as in A as in B class but these
> > fields are in separate tables (for A and B class) with no common table.
> >
> > The problem is: if I have cached query involving A class and then I
> > create/update/delete object of B class then I get invalidated query for
> > class A because both A and B class have common persistent class Base and
> > openjpa decides that changing object of class B affects cached queries
> > involving class A which is not true (I have two separate tables - one for
> A
> > and one for B class).
> >
> > This is significant problem for me because I have lots of inheritors of
> > Base class and all these inheritors have own table and don't have some
> > common table and these query cache invalidates slow system.
> >
> > Is there any workaround? I tried extending QueryCache implementations but
> > with no success (for example removing Base class from access path of
> > QueryKey object didn't help because of some other realization details of
> > QueryKey object which I can't change)
> >
>

RE: Query cache eviction problem with InheritanceType.TABLE_PER_CLASS

Posted by "LYALIKOV, OLEG (OLEG)** CTR **" <ol...@alcatel-lucent.com>.
Thanks for reply Kevin.
Actually there are no any exceptions or errors.

Imagine situation: you have a query "SELECT x FROM A WHERE x.title = 'Some title'". You execute this query a lot of times so openjpa can return cached query result (I assume this is QueryCache).

But then you for example create new object of type B. 
After create openjpa checks cached queries and finds query "SELECT x FROM A WHERE x.title = 'Some title'" which access path (field _accessPathClassNames in QueryKey class) contains class A and class Base and this access path intersects with access path of create query (it contains class B and class Base).
So openjpa decides to remove query "SELECT x FROM A WHERE x.title = 'Some title'" result from cache and when you run this query next time openjpa accesses database.

But entity Base doesn't have own table, its fields are contained as in table A as in table B and tables A and B don't intersect.
So decision to remove query "SELECT x FROM A WHERE x.title = 'Some title'" result from cache after creating object of class B seems wrong to me.

Openjpa considers entities A and B intersect through their base persistent entity Base but actually they don't intersect.

Thanks
Oleg

-----Original Message-----
From: Kevin Sutter [mailto:kwsutter@gmail.com] 
Sent: Thursday, May 19, 2011 7:30 PM
To: users@openjpa.apache.org
Subject: Re: Query cache eviction problem with InheritanceType.TABLE_PER_CLASS

HI Oleg,
Can you post the specific exception or error condition you are referring
to?  OpenJPA utilizes several caches.  It sounds like you might be referring
to the QuerySQLCache not being able to cache the generated SQL.  This is
different from the QueryCache which caches the results of various Queries.
Just trying to clarify which cache you are experiencing problems with.

Thanks,
Kevin

On Thu, May 19, 2011 at 7:28 AM, LYALIKOV, OLEG (OLEG)** CTR ** <
oleg.lyalikov@alcatel-lucent.com> wrote:

> Hello,
> I'm using openjpa-2.0.0 and have some base class
>
> @Entity
> @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> public abstract class Base { ... }
>
> and also some inheritors
>
> @Entity
> @Inheritance(strategy = InheritanceType.JOINED)
> public class A extends Base { ... }
>
> @Entity
> @Inheritance(strategy = InheritanceType.JOINED)
> public class B extends Base { ... }
>
> Base class has some fields which are used as in A as in B class but these
> fields are in separate tables (for A and B class) with no common table.
>
> The problem is: if I have cached query involving A class and then I
> create/update/delete object of B class then I get invalidated query for
> class A because both A and B class have common persistent class Base and
> openjpa decides that changing object of class B affects cached queries
> involving class A which is not true (I have two separate tables - one for A
> and one for B class).
>
> This is significant problem for me because I have lots of inheritors of
> Base class and all these inheritors have own table and don't have some
> common table and these query cache invalidates slow system.
>
> Is there any workaround? I tried extending QueryCache implementations but
> with no success (for example removing Base class from access path of
> QueryKey object didn't help because of some other realization details of
> QueryKey object which I can't change)
>

Re: Query cache eviction problem with InheritanceType.TABLE_PER_CLASS

Posted by Kevin Sutter <kw...@gmail.com>.
HI Oleg,
Can you post the specific exception or error condition you are referring
to?  OpenJPA utilizes several caches.  It sounds like you might be referring
to the QuerySQLCache not being able to cache the generated SQL.  This is
different from the QueryCache which caches the results of various Queries.
Just trying to clarify which cache you are experiencing problems with.

Thanks,
Kevin

On Thu, May 19, 2011 at 7:28 AM, LYALIKOV, OLEG (OLEG)** CTR ** <
oleg.lyalikov@alcatel-lucent.com> wrote:

> Hello,
> I'm using openjpa-2.0.0 and have some base class
>
> @Entity
> @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
> public abstract class Base { ... }
>
> and also some inheritors
>
> @Entity
> @Inheritance(strategy = InheritanceType.JOINED)
> public class A extends Base { ... }
>
> @Entity
> @Inheritance(strategy = InheritanceType.JOINED)
> public class B extends Base { ... }
>
> Base class has some fields which are used as in A as in B class but these
> fields are in separate tables (for A and B class) with no common table.
>
> The problem is: if I have cached query involving A class and then I
> create/update/delete object of B class then I get invalidated query for
> class A because both A and B class have common persistent class Base and
> openjpa decides that changing object of class B affects cached queries
> involving class A which is not true (I have two separate tables - one for A
> and one for B class).
>
> This is significant problem for me because I have lots of inheritors of
> Base class and all these inheritors have own table and don't have some
> common table and these query cache invalidates slow system.
>
> Is there any workaround? I tried extending QueryCache implementations but
> with no success (for example removing Base class from access path of
> QueryKey object didn't help because of some other realization details of
> QueryKey object which I can't change)
>