You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by "f.r.u.x.o.j@gmail.com" <f....@gmail.com> on 2008/03/05 01:08:11 UTC

NullPointerException in org.apache.openjpa.datacache.QueryCacheStoreQuery$QueryCacheExecutor.clearAccessPath(...)

Hi everybody,
trying to remove an instance from the datastore by means of the  
deletion by query I faced an ugly NullPointerException in the  
mentioned class.
Here is the stack-trace:

Caused by: java.lang.NullPointerException
00:28:57,406 ERROR [STDERR] 	at  
org.apache.openjpa.datacache.QueryCacheStoreQuery 
$QueryCacheExecutor.clearAccessPath(QueryCacheStoreQuery.java:337)
00:28:57,414 ERROR [STDERR] 	at  
org.apache.openjpa.datacache.QueryCacheStoreQuery 
$QueryCacheExecutor.executeDelete(QueryCacheStoreQuery.java:345)
00:28:57,420 ERROR [STDERR] 	at  
org.apache.openjpa.kernel.QueryImpl.delete(QueryImpl.java:1008)
00:28:57,425 ERROR [STDERR] 	at  
org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:844)
00:28:57,429 ERROR [STDERR] 	... 34 more

The affected code, taken from OpenJPA 1.0.2 is the following:

         /**
          * Clear the cached queries associated with the access path
          * classes in the query. This is done when bulk operations
          * (such as deletes or updates) are performed so that the
          * cache remains up-to-date.
          */
         private void clearAccessPath(StoreQuery q) {
             if (q == null)
                 return;

             ClassMetaData[] cmd = getAccessPathMetaDatas(q);
             if (cmd == null || cmd.length == 0)
                 return;

             List classes = new ArrayList(cmd.length);
             for (int i = 0; i < cmd.length; i++)
                 classes.add(cmd[i].getDescribedType());

             // evict from the query cache
             QueryCacheStoreQuery cq = (QueryCacheStoreQuery) q;
             cq.getCache().onTypesChanged(new TypesChangedEvent
                 (q.getContext(), classes));

             // evict from the data cache
             for (int i = 0; i < cmd.length; i++)
                 cmd[i].getDataCache().removeAll(
                     cmd[i].getDescribedType(), true);
         }

The failing statement is "cmd[i].getDataCache().removeAll(...)" since  
"cmd[i].getDataCache()" returns 'null';

The point is: given that the "getDataCache()" method is allowed to  
return 'null', it is not safe (at least) blindly invoking any method  
without checking the reference returned by the "getDataCache()"  
method, right?
So is this a bug (maybe already known)? How could it be fixed?

Please note that this bug (if confirmed) is actually preventing me  
from using the delete-by-query feature. The only way I can remove an  
object form the datastore is by loading it into memory for  
subsequently invoke the its removal. Obviously this is not as  
efficient as the deletion by query would be.

Note: I'm using OpenJPA 1.0.2 along with MySQL 5.0.51a.

Thanks in advance,
Francesco


Re: NullPointerException in org.apache.openjpa.datacache.QueryCacheStoreQuery$QueryCacheExecutor.clearAccessPath(...)

Posted by Francesco Russo <f....@gmail.com>.
Thanks Patrick,
this night I worked around the problem by completely disabling the
data-cache, but it obviously remains a mere workaround.

On Wed, Mar 5, 2008 at 2:31 AM, Patrick Linskey <pl...@gmail.com> wrote:

> Hi,
>
> I just checked in a change to trunk (r633739) and the 1.0.x branch
> (r633744) that resolves this. The 1.0.3-SNAPSHOT should update with
> the changes in a few hours.


I'll give it a try asap, many thanks.


>
>
> I expect that it's happening because you have some classes that are
> cached with relations to others that are cached, or something like
> that.


Your guess is right ;)!


> You should be able to work around it by making all your classes
> cacheable, and putting the ones that should not be cacheable into a
> cache with size 0.


I'll try this path (which is probably better than completely disabling the
data-cache) should the 1.0.3 snapshot not fix the issue.

Still thanks and best regards,
Francesco


>
>
> -Patrick
>
> On Tue, Mar 4, 2008 at 4:08 PM, f.r.u.x.o.j@gmail.com
> <f....@gmail.com> wrote:
> > Hi everybody,
> >  trying to remove an instance from the datastore by means of the
> >  deletion by query I faced an ugly NullPointerException in the
> >  mentioned class.
> >  Here is the stack-trace:
> >
> >  Caused by: java.lang.NullPointerException
> >  00:28:57,406 ERROR [STDERR]     at
> >  org.apache.openjpa.datacache.QueryCacheStoreQuery
> >  $QueryCacheExecutor.clearAccessPath(QueryCacheStoreQuery.java:337)
> >  00:28:57,414 ERROR [STDERR]     at
> >  org.apache.openjpa.datacache.QueryCacheStoreQuery
> >  $QueryCacheExecutor.executeDelete(QueryCacheStoreQuery.java:345)
> >  00:28:57,420 ERROR [STDERR]     at
> >  org.apache.openjpa.kernel.QueryImpl.delete(QueryImpl.java:1008)
> >  00:28:57,425 ERROR [STDERR]     at
> >  org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:844)
> >  00:28:57,429 ERROR [STDERR]     ... 34 more
> >
> >  The affected code, taken from OpenJPA 1.0.2 is the following:
> >
> >          /**
> >           * Clear the cached queries associated with the access path
> >           * classes in the query. This is done when bulk operations
> >           * (such as deletes or updates) are performed so that the
> >           * cache remains up-to-date.
> >           */
> >          private void clearAccessPath(StoreQuery q) {
> >              if (q == null)
> >                  return;
> >
> >              ClassMetaData[] cmd = getAccessPathMetaDatas(q);
> >              if (cmd == null || cmd.length == 0)
> >                  return;
> >
> >              List classes = new ArrayList(cmd.length);
> >              for (int i = 0; i < cmd.length; i++)
> >                  classes.add(cmd[i].getDescribedType());
> >
> >              // evict from the query cache
> >              QueryCacheStoreQuery cq = (QueryCacheStoreQuery) q;
> >              cq.getCache().onTypesChanged(new TypesChangedEvent
> >                  (q.getContext(), classes));
> >
> >              // evict from the data cache
> >              for (int i = 0; i < cmd.length; i++)
> >                  cmd[i].getDataCache().removeAll(
> >                      cmd[i].getDescribedType(), true);
> >          }
> >
> >  The failing statement is "cmd[i].getDataCache().removeAll(...)" since
> >  "cmd[i].getDataCache()" returns 'null';
> >
> >  The point is: given that the "getDataCache()" method is allowed to
> >  return 'null', it is not safe (at least) blindly invoking any method
> >  without checking the reference returned by the "getDataCache()"
> >  method, right?
> >  So is this a bug (maybe already known)? How could it be fixed?
> >
> >  Please note that this bug (if confirmed) is actually preventing me
> >  from using the delete-by-query feature. The only way I can remove an
> >  object form the datastore is by loading it into memory for
> >  subsequently invoke the its removal. Obviously this is not as
> >  efficient as the deletion by query would be.
> >
> >  Note: I'm using OpenJPA 1.0.2 along with MySQL 5.0.51a.
> >
> >  Thanks in advance,
> >  Francesco
> >
> >
>
>
>
> --
> Patrick Linskey
> 202 669 5907
>

Re: NullPointerException in org.apache.openjpa.datacache.QueryCacheStoreQuery$QueryCacheExecutor.clearAccessPath(...)

Posted by Patrick Linskey <pl...@gmail.com>.
Hi,

I just checked in a change to trunk (r633739) and the 1.0.x branch
(r633744) that resolves this. The 1.0.3-SNAPSHOT should update with
the changes in a few hours.

I expect that it's happening because you have some classes that are
cached with relations to others that are cached, or something like
that. You should be able to work around it by making all your classes
cacheable, and putting the ones that should not be cacheable into a
cache with size 0.

-Patrick

On Tue, Mar 4, 2008 at 4:08 PM, f.r.u.x.o.j@gmail.com
<f....@gmail.com> wrote:
> Hi everybody,
>  trying to remove an instance from the datastore by means of the
>  deletion by query I faced an ugly NullPointerException in the
>  mentioned class.
>  Here is the stack-trace:
>
>  Caused by: java.lang.NullPointerException
>  00:28:57,406 ERROR [STDERR]     at
>  org.apache.openjpa.datacache.QueryCacheStoreQuery
>  $QueryCacheExecutor.clearAccessPath(QueryCacheStoreQuery.java:337)
>  00:28:57,414 ERROR [STDERR]     at
>  org.apache.openjpa.datacache.QueryCacheStoreQuery
>  $QueryCacheExecutor.executeDelete(QueryCacheStoreQuery.java:345)
>  00:28:57,420 ERROR [STDERR]     at
>  org.apache.openjpa.kernel.QueryImpl.delete(QueryImpl.java:1008)
>  00:28:57,425 ERROR [STDERR]     at
>  org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:844)
>  00:28:57,429 ERROR [STDERR]     ... 34 more
>
>  The affected code, taken from OpenJPA 1.0.2 is the following:
>
>          /**
>           * Clear the cached queries associated with the access path
>           * classes in the query. This is done when bulk operations
>           * (such as deletes or updates) are performed so that the
>           * cache remains up-to-date.
>           */
>          private void clearAccessPath(StoreQuery q) {
>              if (q == null)
>                  return;
>
>              ClassMetaData[] cmd = getAccessPathMetaDatas(q);
>              if (cmd == null || cmd.length == 0)
>                  return;
>
>              List classes = new ArrayList(cmd.length);
>              for (int i = 0; i < cmd.length; i++)
>                  classes.add(cmd[i].getDescribedType());
>
>              // evict from the query cache
>              QueryCacheStoreQuery cq = (QueryCacheStoreQuery) q;
>              cq.getCache().onTypesChanged(new TypesChangedEvent
>                  (q.getContext(), classes));
>
>              // evict from the data cache
>              for (int i = 0; i < cmd.length; i++)
>                  cmd[i].getDataCache().removeAll(
>                      cmd[i].getDescribedType(), true);
>          }
>
>  The failing statement is "cmd[i].getDataCache().removeAll(...)" since
>  "cmd[i].getDataCache()" returns 'null';
>
>  The point is: given that the "getDataCache()" method is allowed to
>  return 'null', it is not safe (at least) blindly invoking any method
>  without checking the reference returned by the "getDataCache()"
>  method, right?
>  So is this a bug (maybe already known)? How could it be fixed?
>
>  Please note that this bug (if confirmed) is actually preventing me
>  from using the delete-by-query feature. The only way I can remove an
>  object form the datastore is by loading it into memory for
>  subsequently invoke the its removal. Obviously this is not as
>  efficient as the deletion by query would be.
>
>  Note: I'm using OpenJPA 1.0.2 along with MySQL 5.0.51a.
>
>  Thanks in advance,
>  Francesco
>
>



-- 
Patrick Linskey
202 669 5907