Class CacheInterceptor
- All Implemented Interfaces:
Cloneable
,org.eclipse.persistence.internal.identitymaps.IdentityMap
Purpose: Define a class through which Cache access can be intercepted.
Description: EclipseLink makes extensive use of caching functionality. This class provides the mechanism for intercepting the cache access. Once intercepted applications can allow the process to continue by calling the method on the class attribute targetIdentityMap as described in the API javadocs or redirect the process entirely. * As with IdentityMaps an entire class inheritance hierarchy will share the same interceptor.
To implement a CacheInterceptor users should subclass this class implementing those methods they wish to intercept.
Configuration: Interceptors may be added to a session by using a Session or Descriptor customizer to set the class name of the interceptor on the target ClassDescriptor through the method setCacheInterceptorClass(Class).
-
Field Summary
Modifier and TypeFieldDescriptionprotected org.eclipse.persistence.internal.sessions.AbstractSession
protected org.eclipse.persistence.internal.identitymaps.IdentityMap
This attribute stores the actual IdentityMap as configured by the user. -
Constructor Summary
ConstructorDescriptionCacheInterceptor
(org.eclipse.persistence.internal.identitymaps.IdentityMap targetIdentityMap, org.eclipse.persistence.internal.sessions.AbstractSession interceptedSession) -
Method Summary
Modifier and TypeMethodDescriptionorg.eclipse.persistence.internal.identitymaps.CacheKey
acquireDeferredLock
(Object primaryKey, boolean isCacheCheckComplete) Acquire a deferred lock on the object.org.eclipse.persistence.internal.identitymaps.CacheKey
acquireLock
(Object primaryKey, boolean forMerge, boolean isCacheCheckComplete) Acquire an active lock on the object.org.eclipse.persistence.internal.identitymaps.CacheKey
acquireLockNoWait
(Object primaryKey, boolean forMerge) Acquire an active lock on the object, if not already locked.org.eclipse.persistence.internal.identitymaps.CacheKey
acquireLockWithWait
(Object primaryKey, boolean forMerge, int wait) Acquire an active lock on the object, if not already locked.org.eclipse.persistence.internal.identitymaps.CacheKey
acquireReadLockOnCacheKey
(Object primaryKey) Acquire a read lock on the object.org.eclipse.persistence.internal.identitymaps.CacheKey
acquireReadLockOnCacheKeyNoWait
(Object primaryKey) Acquire a read lock on the object, if not already locked.abstract Object
clone()
Clone the map and all of the CacheKeys.Enumeration<org.eclipse.persistence.internal.identitymaps.CacheKey>
Allow for theCacheKey
elements to be iterated.void
collectLocks
(HashMap threadList) Add all locked CacheKeys to the map grouped by thread.boolean
containsKey
(Object primaryKey) Return true if an CacheKey with the primary key is in the map.protected abstract CacheKeyInterceptor
createCacheKeyInterceptor
(org.eclipse.persistence.internal.identitymaps.CacheKey wrappedCacheKey) elements()
Allow for the cache to be iterated on.Return the object cached in the identity map or null if it could not be found.getAllCacheKeysFromIdentityMapWithEntityPK
(Object[] pkList, ClassDescriptor descriptor, org.eclipse.persistence.internal.sessions.AbstractSession session) ADVANCED: Using a list of Entity PK this method will attempt to bulk load the entire list from the cache.getAllFromIdentityMapWithEntityPK
(Object[] pkList, ClassDescriptor descriptor, org.eclipse.persistence.internal.sessions.AbstractSession session) ADVANCED: Using a list of Entity PK this method will attempt to bulk load the entire list from the cache.org.eclipse.persistence.internal.identitymaps.CacheKey
getCacheKey
(Object primaryKey, boolean forMerge) Get the cache key (with object) for the primary key.org.eclipse.persistence.internal.identitymaps.CacheKey
getCacheKeyForLock
(Object primaryKey) Get the cache key (with object) for the primary key.Return the descriptor that this is the map for.Return the class that this is the map for.int
int
getSize()
Return the number of CacheKeys in the IdentityMap.int
Return the number of actual objects of type myClass in the IdentityMap.org.eclipse.persistence.internal.identitymaps.IdentityMap
Return the instance of the IdentityMap that this intercpetor is wrapping.getWrapper
(Object primaryKey) Get the wrapper object from the cache key associated with the given primary key, this is used for EJB2.getWriteLockValue
(Object primaryKey) Get the write lock value from the cache key associated to the primarykey.Enumeration<org.eclipse.persistence.internal.identitymaps.CacheKey>
keys()
Allow for theCacheKey
elements to be iterated.Enumeration<org.eclipse.persistence.internal.identitymaps.CacheKey>
keys
(boolean checkReadLocks) Allow for theCacheKey
elements to be iterated.void
lazyRelationshipLoaded
(Object rootEntity, ValueHolderInterface valueHolder, ForeignReferenceMapping mapping) Notify the cache that a lazy relationship has been triggered in the object and the cache may need to be updatedorg.eclipse.persistence.internal.identitymaps.CacheKey
Store the object in the cache at its primary key.Remove the CacheKey with the primaryKey from the map.remove
(org.eclipse.persistence.internal.identitymaps.CacheKey cacheKey) Remove the CacheKey from the map.void
setDescriptor
(ClassDescriptor descriptor) Set the descriptor that this is the map for.void
setWrapper
(Object primaryKey, Object wrapper) Update the wrapper object in the CacheKey associated with the given primaryKey, this is used for EJB2.void
setWriteLockValue
(Object primaryKey, Object writeLockValue) Update the write lock value of the CacheKey associated with the given primaryKey.toString()
void
updateMaxSize
(int maxSize) This method will be used to update the max cache size, any objects exceeding the max cache size will be remove from the cache.Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.eclipse.persistence.internal.identitymaps.IdentityMap
release
-
Field Details
-
targetIdentityMap
protected org.eclipse.persistence.internal.identitymaps.IdentityMap targetIdentityMapThis attribute stores the actual IdentityMap as configured by the user. -
interceptedSession
protected org.eclipse.persistence.internal.sessions.AbstractSession interceptedSession
-
-
Constructor Details
-
CacheInterceptor
public CacheInterceptor(org.eclipse.persistence.internal.identitymaps.IdentityMap targetIdentityMap, org.eclipse.persistence.internal.sessions.AbstractSession interceptedSession)
-
-
Method Details
-
acquireDeferredLock
public org.eclipse.persistence.internal.identitymaps.CacheKey acquireDeferredLock(Object primaryKey, boolean isCacheCheckComplete) Acquire a deferred lock on the object. This is used while reading if the object has relationships without indirection. This first thread will get an active lock. Other threads will get deferred locks, all threads will wait until all other threads are complete before releasing their locks.- Specified by:
acquireDeferredLock
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
acquireLock
public org.eclipse.persistence.internal.identitymaps.CacheKey acquireLock(Object primaryKey, boolean forMerge, boolean isCacheCheckComplete) Acquire an active lock on the object. This is used by reading (when using indirection or no relationships) and by merge.- Specified by:
acquireLock
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
acquireLockNoWait
public org.eclipse.persistence.internal.identitymaps.CacheKey acquireLockNoWait(Object primaryKey, boolean forMerge) Acquire an active lock on the object, if not already locked. This is used by merge for missing existing objects.- Specified by:
acquireLockNoWait
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
acquireLockWithWait
public org.eclipse.persistence.internal.identitymaps.CacheKey acquireLockWithWait(Object primaryKey, boolean forMerge, int wait) Acquire an active lock on the object, if not already locked. This is used by merge for missing existing objects.- Specified by:
acquireLockWithWait
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
acquireReadLockOnCacheKey
public org.eclipse.persistence.internal.identitymaps.CacheKey acquireReadLockOnCacheKey(Object primaryKey) Acquire a read lock on the object. This is used by UnitOfWork cloning. This will allow multiple users to read the same object but prevent writes to the object while the read lock is held.- Specified by:
acquireReadLockOnCacheKey
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
acquireReadLockOnCacheKeyNoWait
public org.eclipse.persistence.internal.identitymaps.CacheKey acquireReadLockOnCacheKeyNoWait(Object primaryKey) Acquire a read lock on the object, if not already locked. This is used by UnitOfWork cloning. This will allow multiple users to read the same object but prevent writes to the object while the read lock is held.- Specified by:
acquireReadLockOnCacheKeyNoWait
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
collectLocks
Add all locked CacheKeys to the map grouped by thread. Used to print all the locks in the identity map.- Specified by:
collectLocks
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
clone
Clone the map and all of the CacheKeys. This is used by UnitOfWork commitAndResumeOnFailure to avoid corrupting the cache during a failed commit. -
containsKey
Return true if an CacheKey with the primary key is in the map. User API.- Specified by:
containsKey
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Parameters:
primaryKey
- is the primary key for the object to search for.
-
createCacheKeyInterceptor
protected abstract CacheKeyInterceptor createCacheKeyInterceptor(org.eclipse.persistence.internal.identitymaps.CacheKey wrappedCacheKey) -
elements
Allow for the cache to be iterated on. This method is only used during debugging when validateCache() has been called to print out the contents of the cache.- Specified by:
elements
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
get
Return the object cached in the identity map or null if it could not be found. User API.- Specified by:
get
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getAllFromIdentityMapWithEntityPK
public abstract Map<Object,Object> getAllFromIdentityMapWithEntityPK(Object[] pkList, ClassDescriptor descriptor, org.eclipse.persistence.internal.sessions.AbstractSession session) ADVANCED: Using a list of Entity PK this method will attempt to bulk load the entire list from the cache. In certain circumstances this can have large performance improvements over loading each item individually.- Specified by:
getAllFromIdentityMapWithEntityPK
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Parameters:
pkList
- List of Entity PKs to extract from the cachedescriptor
- Descriptor type to be retrieved.- Returns:
- Map of Entity PKs associated to the Entities that were retrieved
- Throws:
QueryException
-
getAllCacheKeysFromIdentityMapWithEntityPK
public abstract Map<Object,org.eclipse.persistence.internal.identitymaps.CacheKey> getAllCacheKeysFromIdentityMapWithEntityPK(Object[] pkList, ClassDescriptor descriptor, org.eclipse.persistence.internal.sessions.AbstractSession session) ADVANCED: Using a list of Entity PK this method will attempt to bulk load the entire list from the cache. In certain circumstances this can have large performance improvements over loading each item individually.- Specified by:
getAllCacheKeysFromIdentityMapWithEntityPK
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Parameters:
pkList
- List of Entity PKs to extract from the cachedescriptor
- Descriptor type to be retrieved.- Returns:
- Map of Entity PKs associated to the Entities that were retrieved
- Throws:
QueryException
-
getCacheKey
public org.eclipse.persistence.internal.identitymaps.CacheKey getCacheKey(Object primaryKey, boolean forMerge) Get the cache key (with object) for the primary key.- Specified by:
getCacheKey
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getCacheKeyForLock
Get the cache key (with object) for the primary key.- Specified by:
getCacheKeyForLock
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getDescriptor
Return the descriptor that this is the map for.- Specified by:
getDescriptor
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getDescriptorClass
Return the class that this is the map for.- Specified by:
getDescriptorClass
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getMaxSize
public int getMaxSize()- Specified by:
getMaxSize
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Returns:
- The maxSize for the IdentityMap (NOTE: some subclasses may use this differently).
-
getSize
public int getSize()Return the number of CacheKeys in the IdentityMap. This may contain weak referenced objects that have been garbage collected.- Specified by:
getSize
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getSize
Return the number of actual objects of type myClass in the IdentityMap. Recurse = true will include subclasses of myClass in the count.- Specified by:
getSize
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getTargetIdenttyMap
public org.eclipse.persistence.internal.identitymaps.IdentityMap getTargetIdenttyMap()Return the instance of the IdentityMap that this intercpetor is wrapping. Any call that is to be passed on to the underlying EclipseLink cache should be passed to this IdentityMap. -
getWrapper
Get the wrapper object from the cache key associated with the given primary key, this is used for EJB2.- Specified by:
getWrapper
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
getWriteLockValue
Get the write lock value from the cache key associated to the primarykey. User API.- Specified by:
getWriteLockValue
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
keys
Allow for theCacheKey
elements to be iterated.CacheKey
Collection
is reused so this iteration may not be thread safe.- Specified by:
keys
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Returns:
Enumeration
ofCacheKey
instances.
-
cloneKeys
Allow for theCacheKey
elements to be iterated. Clone ofCacheKey
Collection
is returned so this iteration should be thread safe.- Specified by:
cloneKeys
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Returns:
Enumeration
with clone of theCacheKey
Collection
-
keys
public Enumeration<org.eclipse.persistence.internal.identitymaps.CacheKey> keys(boolean checkReadLocks) Allow for theCacheKey
elements to be iterated.CacheKey
Collection
is reused so this iteration may not be thread safe.- Specified by:
keys
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Parameters:
checkReadLocks
- value oftrue
if read lock on theCacheKey
instances should be checked orfalse
otherwise- Returns:
Enumeration
ofCacheKey
instances.
-
lazyRelationshipLoaded
public void lazyRelationshipLoaded(Object rootEntity, ValueHolderInterface valueHolder, ForeignReferenceMapping mapping) Notify the cache that a lazy relationship has been triggered in the object and the cache may need to be updated- Specified by:
lazyRelationshipLoaded
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
put
public org.eclipse.persistence.internal.identitymaps.CacheKey put(Object primaryKey, Object object, Object writeLockValue, long readTime) Store the object in the cache at its primary key. This is used by InsertObjectQuery, typically into the UnitOfWork identity map. Merge and reads do not use put, but acquireLock. Also an advanced (very) user API.- Specified by:
put
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
- Parameters:
primaryKey
- is the primary key for the object.object
- is the domain object to cache.writeLockValue
- is the current write lock value of object, if null the version is ignored.
-
remove
Remove the CacheKey with the primaryKey from the map. This is used by DeleteObjectQuery and merge. This is also an advanced (very) user API.- Specified by:
remove
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
remove
Remove the CacheKey from the map.- Specified by:
remove
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
updateMaxSize
public void updateMaxSize(int maxSize) This method will be used to update the max cache size, any objects exceeding the max cache size will be remove from the cache. Please note that this does not remove the object from the identityMap, except in the case of the CacheIdentityMap.- Specified by:
updateMaxSize
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
setDescriptor
Set the descriptor that this is the map for.- Specified by:
setDescriptor
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
setWrapper
Update the wrapper object in the CacheKey associated with the given primaryKey, this is used for EJB2.- Specified by:
setWrapper
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
setWriteLockValue
Update the write lock value of the CacheKey associated with the given primaryKey. This is used by UpdateObjectQuery, and is also an advanced (very) user API.- Specified by:
setWriteLockValue
in interfaceorg.eclipse.persistence.internal.identitymaps.IdentityMap
-
toString
-