Module org.eclipse.persistence.core
Class AbstractIdentityMap
java.lang.Object
org.eclipse.persistence.internal.identitymaps.AbstractIdentityMap
- All Implemented Interfaces:
Serializable
,Cloneable
,IdentityMap
- Direct Known Subclasses:
FullIdentityMap
,NoIdentityMap
public abstract class AbstractIdentityMap
extends Object
implements IdentityMap, Serializable, Cloneable
Purpose: Caches objects, and allows their retrieval by their primary key.
Responsibilities:
- Store CacheKeys containing objects and possibly writeLockValues.
- Insert & retrieve objects from the cache.
- Allow retrieval and modification of writeLockValue for a cached object.
- Since:
- TOPLink/Java 1.0
- See Also:
-
Field Summary
Modifier and TypeFieldDescriptionprotected ClassDescriptor
PERF: Store the descriptor to allow lastAccessed cache lookup optimization.protected boolean
Is this identity map within an IsolatedClientSessionprotected int
The initial or maximum size of the cache depending upon the concrete implementation.protected AbstractSession
Session that the map is on -
Constructor Summary
ModifierConstructorDescriptionprotected
protected
AbstractIdentityMap
(int size, ClassDescriptor descriptor, AbstractSession session, boolean isolated) Instantiate an new IdentityMap with it's maximum size. -
Method Summary
Modifier and TypeMethodDescriptionacquireDeferredLock
(Object primaryKey, boolean isCacheCheckComplete) Acquire a deferred lock on the object.acquireLock
(Object primaryKey, boolean forMerge, boolean isCacheCheckComplete) Acquire an active lock on the object.acquireLockNoWait
(Object primaryKey, boolean forMerge) Acquire an active lock on the object, if not already locked.acquireLockWithWait
(Object primaryKey, boolean forMerge, int wait) Acquire an active lock on the object, if not already locked.acquireReadLockOnCacheKey
(Object primaryKey) Acquire a read lock on the object.acquireReadLockOnCacheKeyNoWait
(Object primaryKey) Acquire a read lock on the object, if not already locked.clone()
Clone the map and all of the CacheKeys.abstract 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.createCacheKey
(Object primaryKey, Object object, Object writeLockValue, long readTime) Create the correct type of CacheKey for this map.abstract Enumeration
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, 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, AbstractSession session) ADVANCED: Using a list of Entity PK this method will attempt to bulk load the entire list from the cache.abstract CacheKey
getCacheKey
(Object primaryKey, boolean forMerge) Get the cache key (with object) for the primary key.getCacheKeyForLock
(Object primaryKey) Get the cache key (with object) for the primary key.protected CacheKey
getCacheKeyWithReadLock
(Object primaryKey) Get the cache key (with object) for the primary key with read lock.static Class
<? extends IdentityMap> Returns the class which should be used as an identity map in a descriptor by default.Return the class that this is the map for.Class
<?> Return the class that this is the map for.int
abstract int
getSize()
Return the number of CacheKeys in the IdentityMap.abstract int
Return the number of actual objects of type myClass in the IdentityMap.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.abstract Enumeration
keys()
Allow for the CacheKeys to be iterated on.abstract CacheKey
Store the object in the cache at its primary key.protected abstract CacheKey
putCacheKeyIfAbsent
(CacheKey cacheKey) Return the CacheKey (with object) matching the searchKey.void
release()
This method may be called during initialize all identity maps.Remove the CacheKey with the primaryKey from the map.abstract Object
Remove the CacheKey from the map.void
setDescriptor
(ClassDescriptor descriptor) Set the descriptor that this is the map for.protected void
setMaxSize
(int size) Set the maximum size for the receiver.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
cloneKeys, keys, lazyRelationshipLoaded
-
Field Details
-
maxSize
protected int maxSizeThe initial or maximum size of the cache depending upon the concrete implementation. -
descriptor
PERF: Store the descriptor to allow lastAccessed cache lookup optimization. -
isIsolated
protected boolean isIsolatedIs this identity map within an IsolatedClientSession -
session
Session that the map is on
-
-
Constructor Details
-
AbstractIdentityMap
protected AbstractIdentityMap() -
AbstractIdentityMap
protected AbstractIdentityMap(int size, ClassDescriptor descriptor, AbstractSession session, boolean isolated) Instantiate an new IdentityMap with it's maximum size.NOTE: Subclasses may provide different behavior for maxSize.
- Parameters:
size
- is the maximum size to be allocated for the receiver.
-
-
Method Details
-
acquireDeferredLock
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 interfaceIdentityMap
-
acquireLock
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 interfaceIdentityMap
-
acquireLockNoWait
Acquire an active lock on the object, if not already locked. This is used by merge for missing existing objects.- Specified by:
acquireLockNoWait
in interfaceIdentityMap
-
acquireLockWithWait
Acquire an active lock on the object, if not already locked. This is used by merge for missing existing objects.- Specified by:
acquireLockWithWait
in interfaceIdentityMap
-
acquireReadLockOnCacheKey
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 interfaceIdentityMap
-
acquireReadLockOnCacheKeyNoWait
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 interfaceIdentityMap
-
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 interfaceIdentityMap
-
clone
Clone the map and all of the CacheKeys. This is used by UnitOfWork commitAndResumeOnFailure to avoid corrupting the cache during a failed commit.- Specified by:
clone
in interfaceIdentityMap
- Overrides:
clone
in classObject
-
containsKey
Return true if an CacheKey with the primary key is in the map. User API.- Specified by:
containsKey
in interfaceIdentityMap
- Parameters:
primaryKey
- is the primary key for the object to search for.
-
createCacheKey
public CacheKey createCacheKey(Object primaryKey, Object object, Object writeLockValue, long readTime) Create the correct type of CacheKey for this map. -
elements
Allow for the cache to be iterated on.- Specified by:
elements
in interfaceIdentityMap
-
get
Return the object cached in the identity map or null if it could not be found. User API.- Specified by:
get
in interfaceIdentityMap
-
getAllFromIdentityMapWithEntityPK
public Map<Object,Object> getAllFromIdentityMapWithEntityPK(Object[] pkList, ClassDescriptor descriptor, 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 interfaceIdentityMap
- 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
-
getAllCacheKeysFromIdentityMapWithEntityPK
public Map<Object,CacheKey> getAllCacheKeysFromIdentityMapWithEntityPK(Object[] pkList, ClassDescriptor descriptor, 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 interfaceIdentityMap
- 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
-
getCacheKey
Get the cache key (with object) for the primary key.- Specified by:
getCacheKey
in interfaceIdentityMap
-
getCacheKeyForLock
Get the cache key (with object) for the primary key.- Specified by:
getCacheKeyForLock
in interfaceIdentityMap
-
putCacheKeyIfAbsent
Return the CacheKey (with object) matching the searchKey. If the CacheKey is missing then put the searchKey in the map. The searchKey should have already been locked. -
getCacheKeyWithReadLock
Get the cache key (with object) for the primary key with read lock. -
getDefaultIdentityMapClass
Returns the class which should be used as an identity map in a descriptor by default. -
getMaxSize
public int getMaxSize()- Specified by:
getMaxSize
in interfaceIdentityMap
- Returns:
- The maxSize for the IdentityMap (NOTE: some subclasses may use this differently).
-
getSize
public abstract 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 interfaceIdentityMap
-
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 interfaceIdentityMap
-
getWrapper
Get the wrapper object from the cache key associated with the given primary key, this is used for EJB2.- Specified by:
getWrapper
in interfaceIdentityMap
-
getWriteLockValue
Get the write lock value from the cache key associated to the primarykey. User API.- Specified by:
getWriteLockValue
in interfaceIdentityMap
-
keys
Allow for the CacheKeys to be iterated on.- Specified by:
keys
in interfaceIdentityMap
-
put
public abstract 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 interfaceIdentityMap
- 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.
-
release
public void release()This method may be called during initialize all identity maps. It allows the identity map or interceptor the opportunity to release any resources before being thrown away.- Specified by:
release
in interfaceIdentityMap
-
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 interfaceIdentityMap
-
remove
Remove the CacheKey from the map.- Specified by:
remove
in interfaceIdentityMap
-
setMaxSize
protected void setMaxSize(int size) Set the maximum size for the receiver.- Parameters:
size
- is the new maximum size.
-
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 interfaceIdentityMap
-
getDescriptor
Return the class that this is the map for.- Specified by:
getDescriptor
in interfaceIdentityMap
-
getDescriptorClass
Return the class that this is the map for.- Specified by:
getDescriptorClass
in interfaceIdentityMap
-
setDescriptor
Set the descriptor that this is the map for.- Specified by:
setDescriptor
in interfaceIdentityMap
-
setWrapper
Update the wrapper object in the CacheKey associated with the given primaryKey, this is used for EJB2.- Specified by:
setWrapper
in interfaceIdentityMap
-
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 interfaceIdentityMap
-
toString
- Specified by:
toString
in interfaceIdentityMap
- Overrides:
toString
in classObject
-