Dear Jackrabbit experts
I'm facing a strange problem where sometimes we get an InvalidStateException
with an error message like this:
javax.jcr.InvalidItemStateException: Item cannot be saved because it has been
modified externally: node /
org.apache.jackrabbit.ocm.exception.ObjectContentManagerException: Cannot
persist current session changes.; nested exception is
javax.jcr.InvalidItemStateException: Item cannot be saved because it has been
modified externally: node /
javax.jcr.InvalidItemStateException: Item cannot be saved because it has been
modified externally: node /
at
org.apache.jackrabbit.core.ItemImpl.getTransientStates(ItemImpl.java:246)
at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:942)
at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:915)
at
org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl.save(ObjectContentManagerImpl.java:1070)
....
The node which cannot be saved varies. Here it seems to be the root node but it
can be next to anything.
Now my uneducated guess is that we have a concurrent access problem (several
requests of our webapplication trying to update the same node or a node in the
same path or ...?). If you agree with me would you mind giving me some pointers
on how to resolve this problem properly? Of course I cannot lock a node
forever. From when to when do I have to lock it?
More info:
- We're working with OCM
- The error occurs when we're trying to persist a bean to the repository.
- The code which does that looks like this:
ObjectContentManager ocm = getObjectContentManager("data");
// gets the ObjectContentMananger for the "data" repository
ocm.update(cardOrder); // cardOrder is my bean which needs
to be persisted. It already exists in the repository
ocm.save();
Any help is warmly appreciated!
-will